<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Molecule.dev Changelog</title>
    <link>https://www.molecule.dev/changelog</link>
    <description>What shipped: @molecule/* package releases and molecule.dev changes, by day.</description>
    <language>en</language>
    <lastBuildDate>Fri, 04 Sep 2026 00:00:00 GMT</lastBuildDate>
    <atom:link href="https://www.molecule.dev/changelog.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Changes on 2026-09-04</title>
      <link>https://www.molecule.dev/changelog#2026-09-04</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-09-04</guid>
      <pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate>
      <description>3 changes: minor: Add gemini-3.8-flash and deprecate gemini-3.7-flash; record the DeepInfra US region for glm-5.3. (@molecule/api-resource-ai-models@1.5.0); patch: The command menu now dedupes by id, so a host-provided command with the same id as a shared one replaces it instead of listing twice. (@molecule/app-ide-react@1.10.1); patch: The default model is now gemini-3.8-flash. (@molecule/api-ai-google@1.2.1)</description>
      <content:encoded><![CDATA[<ul><li>minor: Add gemini-3.8-flash and deprecate gemini-3.7-flash; record the DeepInfra US region for glm-5.3. (@molecule/api-resource-ai-models@1.5.0)</li><li>patch: The command menu now dedupes by id, so a host-provided command with the same id as a shared one replaces it instead of listing twice. (@molecule/app-ide-react@1.10.1)</li><li>patch: The default model is now gemini-3.8-flash. (@molecule/api-ai-google@1.2.1)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-09-02</title>
      <link>https://www.molecule.dev/changelog#2026-09-02</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-09-02</guid>
      <pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate>
      <description>11 changes: minor: Adds `claude-fable-5-1` (Anthropic&apos;s current latest; same $10/$50 per MTok as `claude-fable-5`, with $0.25/MTok cache reads) and marks `claude-fable-5` as legacy. `claude-sonnet-5` is now listed at its standard $2/$10 rate. Model ids with a dash-separated minor version (e.g. `claude-fable-5-1`) now parse as a newer generation of their family instead of a sibling. (@molecule/api-resource-ai-models@1.4.0); minor: Adds a side-channel send for human-to-human chat messages (e.g. team notes): `ChatProvider.sendSideMessage` (optional, implemented by the HTTP bond on an independent request lifecycle) and a `sideChannel` option on `useChat`&apos;s `sendMessage`. A side-channel message goes out immediately even while a turn is streaming — it never queues behind the active turn, never aborts the live stream, and never disrupts remote-turn tracking. Callers fall back to the normal send path on providers without side-channel support. (3 packages); minor: Adds an optional `onRestartBackend` escalation hook to the preview panel: when the backing server answers probes but the app has not confirmed a render for minutes and an automatic reload was already tried, the panel asks the host to restart the backing dev server — at most once per broken episode, with a long cooldown, never during a build. This recovers failure classes a document reload cannot (e.g. module failures cached against the dev server&apos;s immutable versioned URLs). Hosts that omit the prop are unaffected. (@molecule/app-ide-react@1.10.0); …</description>
      <content:encoded><![CDATA[<ul><li>minor: Adds `claude-fable-5-1` (Anthropic&apos;s current latest; same $10/$50 per MTok as `claude-fable-5`, with $0.25/MTok cache reads) and marks `claude-fable-5` as legacy. `claude-sonnet-5` is now listed at its standard $2/$10 rate. Model ids with a dash-separated minor version (e.g. `claude-fable-5-1`) now parse as a newer generation of their family instead of a sibling. (@molecule/api-resource-ai-models@1.4.0)</li><li>minor: Adds a side-channel send for human-to-human chat messages (e.g. team notes): `ChatProvider.sendSideMessage` (optional, implemented by the HTTP bond on an independent request lifecycle) and a `sideChannel` option on `useChat`&apos;s `sendMessage`. A side-channel message goes out immediately even while a turn is streaming — it never queues behind the active turn, never aborts the live stream, and never disrupts remote-turn tracking. Callers fall back to the normal send path on providers without side-channel support. (3 packages)</li><li>minor: Adds an optional `onRestartBackend` escalation hook to the preview panel: when the backing server answers probes but the app has not confirmed a render for minutes and an automatic reload was already tried, the panel asks the host to restart the backing dev server — at most once per broken episode, with a long cooldown, never during a build. This recovers failure classes a document reload cannot (e.g. module failures cached against the dev server&apos;s immutable versioned URLs). Hosts that omit the prop are unaffected. (@molecule/app-ide-react@1.10.0)</li><li>minor: Peak-hour pricing windows can be restricted to certain UTC weekdays (`peakPricing.windows[].daysOfWeekUtc`), and the DeepSeek entries now carry the Monday-through-Friday qualifier their rate card publishes, so weekend hours inside those windows no longer meter at the peak multiplier. The `/models` picker labels a weekday-only window with the days it applies on. (2 packages)</li><li>patch: Peak-hour pricing windows can be restricted to certain UTC weekdays (`peakPricing.windows[].daysOfWeekUtc`), and the DeepSeek entries now carry the Monday-through-Friday qualifier their rate card publishes, so weekend hours inside those windows no longer meter at the peak multiplier. The `/models` picker labels a weekday-only window with the days it applies on. (@molecule/app-ide-react@1.10.0)</li><li>patch: Read-only viewers no longer auto-send the initial prompt on mount (a stale project-keyed prompt could start a turn the server rejects) and the auto-fix countdown can never dispatch a fix turn from a viewer&apos;s client. (@molecule/app-ide-react@1.10.0)</li><li>patch: Team notes (/teamsay) now send immediately even while a response is streaming, instead of silently queuing until the turn ends; and read-only viewers no longer arm the auto-commit countdown, which fired /commit on their behalf and surfaced a spurious &quot;view-only access, so this command is unavailable&quot; notice. (@molecule/app-ide-react@1.10.0)</li><li>patch: The preview panel now recovers on its own after its server comes back: while the &quot;can&apos;t load here&quot; or &quot;preview is blank&quot; notice is showing, it keeps probing the preview URL and reloads automatically once the app is serving again (for example after a slow sandbox wake), instead of waiting for a manual reload. (@molecule/app-ide-react@1.10.0)</li><li>patch: The preview&apos;s first-load spinner can no longer sit forever without a way out: if the preview server hasn&apos;t answered after 45 seconds, the panel shows the reload / open-in-new-tab notice while it keeps polling (mounting and clearing the notice by itself when the server appears), and the 30-second stuck backstop now re-checks after wake/build holds instead of disarming permanently. (@molecule/app-ide-react@1.10.0)</li><li>patch: The preview&apos;s stuck-load recovery no longer reloads a heartbeating document: the inline bridge heartbeats from HTML-parse time, so liveness means the module graph is still loading — reloading it aborted every in-flight module fetch and could trap large apps (slow module graphs behind a proxy) in a permanent reload-and-blank loop. Recovery still fires for a genuinely dead document. (@molecule/app-ide-react@1.10.0)</li><li>patch: Viewers watching a teammate&apos;s turn now see the normal streaming activity indicator; previously the chat activity slot showed &quot;Waiting for the development environment to finish starting…&quot; for the whole remote turn even when the environment was already running. (@molecule/app-ide-react@1.10.0)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-29</title>
      <link>https://www.molecule.dev/changelog#2026-08-29</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-29</guid>
      <pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate>
      <description>7 changes: minor: `ShareLinkManager` accepts a `refreshSignal` prop so a host&apos;s live-update channel can reload the link list in place, and the ChatPanel&apos;s settings re-read signal now refreshes the full agent-behavior bag (per-mode models, effort, regions, max tool loops, auto-fix, auto-approve) — so pickers and toggles reflect changes another collaborator just made instead of holding stale values. (@molecule/app-ide-react@1.9.0); minor: Add qwen3.8-flash (Alibaba&apos;s low-cost tier: 1M context, 131K output, multimodal input, hybrid thinking; native host); correct qwen3.8-max&apos;s implicit cache-read price. (@molecule/api-resource-ai-models@1.3.0); patch: `/effort` now opens a selectable level picker (like `/model`): bare `/effort` lists the target mode&apos;s model-native levels with current/default indicators, live typing filter, a mode selector, and keyboard navigation. `/effort ?` keeps the textual status view; `/effort &lt;level&gt;` still sets directly. (@molecule/app-ide-react@1.9.1); …</description>
      <content:encoded><![CDATA[<ul><li>minor: `ShareLinkManager` accepts a `refreshSignal` prop so a host&apos;s live-update channel can reload the link list in place, and the ChatPanel&apos;s settings re-read signal now refreshes the full agent-behavior bag (per-mode models, effort, regions, max tool loops, auto-fix, auto-approve) — so pickers and toggles reflect changes another collaborator just made instead of holding stale values. (@molecule/app-ide-react@1.9.0)</li><li>minor: Add qwen3.8-flash (Alibaba&apos;s low-cost tier: 1M context, 131K output, multimodal input, hybrid thinking; native host); correct qwen3.8-max&apos;s implicit cache-read price. (@molecule/api-resource-ai-models@1.3.0)</li><li>patch: `/effort` now opens a selectable level picker (like `/model`): bare `/effort` lists the target mode&apos;s model-native levels with current/default indicators, live typing filter, a mode selector, and keyboard navigation. `/effort ?` keeps the textual status view; `/effort &lt;level&gt;` still sets directly. (@molecule/app-ide-react@1.9.1)</li><li>patch: Add the `ide.chat.settings.effort.label` (&quot;Reasoning effort&quot;) translation in all 79 languages. (@molecule/app-locales-ide@1.3.1)</li><li>patch: Chat broadcasts missed while the push channel was down (e.g. a teammate&apos;s note against a backgrounded tab) are reconciled from the persisted transcript when the channel reconnects. (@molecule/app-react@1.3.1)</li><li>patch: The context-usage ring&apos;s mount-time restore retries transient failures instead of silently losing the ring for the whole session. (@molecule/app-ide-react@1.9.1)</li><li>patch: The preview freeze watchdog is visibility-aware: a hidden tab&apos;s throttled timers no longer read as an 18–58s &quot;app stopped responding&quot; freeze (banner + alert once per throttle wake, ~every minute, for as long as the tab stayed backgrounded). Checks pause while hidden and re-baseline on return to the foreground. (@molecule/app-ide-react@1.9.1)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-28</title>
      <link>https://www.molecule.dev/changelog#2026-08-28</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-28</guid>
      <pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate>
      <description>7 changes: minor: Add `canShare` to ChatPanel and `canManage`/`canCreate`/`canRevoke` to ShareModal so hosts that gate share-link management above the edit role can hide the /share command, header share button, and modal controls instead of surfacing requests the backend rejects; read-only viewers no longer trigger a settings write when their selected model is delisted. The locale bond adds the matching `ide.chat.share.notAllowed` message in all languages. (2 packages); minor: Honor `toolChoice` (&apos;required&apos; and named-tool forms) as OpenAI-compatible `tool_choice`. MiniMax and Moonshot family gates now key on the canonical model id (a `modelMap`-translated upstream id never matched, so re-hosted requests lost their thinking rules); MiniMax forwards image input for the natively-multimodal M3 and disables its thinking via `chat_template_kwargs` on hosts that ignore the `thinking` param; Alibaba pairs a forced tool choice with an explicit thinking-off (DashScope rejects forced `tool_choice` in thinking mode). (4 packages); minor: Live collaborative chat streaming: pushed broadcast frames from a turn running elsewhere (a teammate&apos;s send, another tab) render in real time — text and thinking deltas, tool activity, verification, completion — via the new `useChat.applyRemoteEvent` ingestion path, with a `readOnly` watcher mode for viewers and a progress-preserving history reconcile. Agent-setting changes (model, effort, fast mode, max tool loops, processing region, auto-fix, auto-approve) surface as shared, attributed transcript cards through the new `setting` card kind. (4 packages); …</description>
      <content:encoded><![CDATA[<ul><li>minor: Add `canShare` to ChatPanel and `canManage`/`canCreate`/`canRevoke` to ShareModal so hosts that gate share-link management above the edit role can hide the /share command, header share button, and modal controls instead of surfacing requests the backend rejects; read-only viewers no longer trigger a settings write when their selected model is delisted. The locale bond adds the matching `ide.chat.share.notAllowed` message in all languages. (2 packages)</li><li>minor: Honor `toolChoice` (&apos;required&apos; and named-tool forms) as OpenAI-compatible `tool_choice`. MiniMax and Moonshot family gates now key on the canonical model id (a `modelMap`-translated upstream id never matched, so re-hosted requests lost their thinking rules); MiniMax forwards image input for the natively-multimodal M3 and disables its thinking via `chat_template_kwargs` on hosts that ignore the `thinking` param; Alibaba pairs a forced tool choice with an explicit thinking-off (DashScope rejects forced `tool_choice` in thinking mode). (4 packages)</li><li>minor: Live collaborative chat streaming: pushed broadcast frames from a turn running elsewhere (a teammate&apos;s send, another tab) render in real time — text and thinking deltas, tool activity, verification, completion — via the new `useChat.applyRemoteEvent` ingestion path, with a `readOnly` watcher mode for viewers and a progress-preserving history reconcile. Agent-setting changes (model, effort, fast mode, max tool loops, processing region, auto-fix, auto-approve) surface as shared, attributed transcript cards through the new `setting` card kind. (4 packages)</li><li>minor: Send server tools in Zhipu&apos;s native nested schema (`{ type: &apos;web_search&apos;, web_search: {} }`) instead of the abstract `{ type, name }` marker, which the API rejects. New `supportsServerTools: false` config drops server tools for OpenAI-compatible hosts that don&apos;t serve them, so tool-carrying requests succeed there. (@molecule/api-ai-zhipu@1.1.0)</li><li>minor: Tool-use blocks and events carry an optional provider-opaque `signature` replay token. The Google bond captures Gemini 3.x&apos;s part-level `thoughtSignature` on function calls and echoes it on replayed calls — without it, Gemini rejects the second request of any tool round-trip (400 &quot;Function call is missing a thought_signature&quot;). The Google bond also sends `thinking.effort` as `thinkingLevel` (previously the effort value was silently ignored and a fixed token budget was sent), and forwards the `google_search` server tool with `includeServerSideToolInvocations` when function tools ride along. (2 packages)</li><li>patch: Correct the Anthropic `codeExecutionToolType` to the current `code_execution_20260521` (the previous value was a beta-header date, not a tool type) and remove `webSearchToolType` from OpenAI entries — the chat-completions endpoint the OpenAI provider uses has no such tool type, so advertising it surfaced a capability that could never work. (@molecule/api-resource-ai-models@1.2.7)</li><li>patch: Parse xAI&apos;s string-form error bodies (`{ code, error }`) so upstream 400 details are logged instead of a bare &quot;HTTP 400&quot;, and surface an attachment-specific message when an image is rejected for size instead of the generic invalid-request text. (@molecule/api-ai-xai@1.0.2)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-27</title>
      <link>https://www.molecule.dev/changelog#2026-08-27</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-27</guid>
      <pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate>
      <description>8 changes: minor: Add `ChatParams.extraBody` — extra provider-native request-body params (e.g. `reasoning_effort`, `enable_thinking`, `top_k`) shallow-merged into the outgoing request as a base, with the bond&apos;s structural fields (model, messages, tools, stream, token limit) always winning. The Gemini bond merges a nested `generationConfig` into its own rather than replacing it. (4 packages); minor: Add team-only chat messages: `ChatMessage` gains a `teamOnly` flag (a human-only note the model never sees, rendered with author attribution) and the chat stream gains a `{ type: &apos;message&apos;; message: ChatMessage }` event that appends a complete, non-streaming message to the transcript. The React `useChat` binding handles the new event via `appendCompleteMessage`, with the same id-based dedupe as card messages so a live team note is byte-identical to what history reloads. (2 packages); minor: ChatPanel gains a `canEdit` prop (default `true`): when `false` — a read-only project viewer — the composer blocks a plain message or write-command with a read-only note (team `/teamsay` and viewer-safe commands still pass), slash commands default-deny unless the command registry flags them `viewerSafe`, the plan/fast mode toggles disable, and a view-only note shows above the composer. `CommandDef` gains a `viewerSafe` flag. The `/model` picker now refreshes when the custom-model catalog changes (editing a BYO provider no longer leaves the old model shown), and a removed custom model re-points to the same provider before a platform fallback. Also renders teammates&apos; human-only team notes (the `message` stream event) and matches side-channel command aliases. app-locales-ide adds the read-only-viewer strings. (@molecule/app-ide-react@1.6.0); …</description>
      <content:encoded><![CDATA[<ul><li>minor: Add `ChatParams.extraBody` — extra provider-native request-body params (e.g. `reasoning_effort`, `enable_thinking`, `top_k`) shallow-merged into the outgoing request as a base, with the bond&apos;s structural fields (model, messages, tools, stream, token limit) always winning. The Gemini bond merges a nested `generationConfig` into its own rather than replacing it. (4 packages)</li><li>minor: Add team-only chat messages: `ChatMessage` gains a `teamOnly` flag (a human-only note the model never sees, rendered with author attribution) and the chat stream gains a `{ type: &apos;message&apos;; message: ChatMessage }` event that appends a complete, non-streaming message to the transcript. The React `useChat` binding handles the new event via `appendCompleteMessage`, with the same id-based dedupe as card messages so a live team note is byte-identical to what history reloads. (2 packages)</li><li>minor: ChatPanel gains a `canEdit` prop (default `true`): when `false` — a read-only project viewer — the composer blocks a plain message or write-command with a read-only note (team `/teamsay` and viewer-safe commands still pass), slash commands default-deny unless the command registry flags them `viewerSafe`, the plan/fast mode toggles disable, and a view-only note shows above the composer. `CommandDef` gains a `viewerSafe` flag. The `/model` picker now refreshes when the custom-model catalog changes (editing a BYO provider no longer leaves the old model shown), and a removed custom model re-points to the same provider before a platform fallback. Also renders teammates&apos; human-only team notes (the `message` stream event) and matches side-channel command aliases. app-locales-ide adds the read-only-viewer strings. (@molecule/app-ide-react@1.6.0)</li><li>minor: Share modal now reflects a project&apos;s current public link: when one exists it shows the full, absolute URL with click-to-copy and a Revoke control and no longer offers to create another; when none exists it offers create. Adds a reusable `ShareLinkManager` component (export) so a host can render the same UI in its own team/access panel. (@molecule/app-ide-react@1.5.0)</li><li>patch: Add GLM-5.3 Flash (zhipu): native multimodal, 1M context, 128K output, low/high/max reasoning, served in us + cn regions. (@molecule/api-resource-ai-models@1.2.6)</li><li>patch: ChatPanel gains a `canEdit` prop (default `true`): when `false` — a read-only project viewer — the composer blocks a plain message or write-command with a read-only note (team `/teamsay` and viewer-safe commands still pass), slash commands default-deny unless the command registry flags them `viewerSafe`, the plan/fast mode toggles disable, and a view-only note shows above the composer. `CommandDef` gains a `viewerSafe` flag. The `/model` picker now refreshes when the custom-model catalog changes (editing a BYO provider no longer leaves the old model shown), and a removed custom model re-points to the same provider before a platform fallback. Also renders teammates&apos; human-only team notes (the `message` stream event) and matches side-channel command aliases. app-locales-ide adds the read-only-viewer strings. (@molecule/app-locales-ide@1.1.6)</li><li>patch: Default model is now `glm-5.3` (was `glm-5.2`). Documents that glm-5.3 narrows `reasoning_effort` to low | high | max and can no longer disable reasoning; the budget-tokens fallback keeps returning the `&apos;high&apos;`/`&apos;low&apos;` both generations accept. (@molecule/api-ai-zhipu@1.0.2)</li><li>patch: Share modal now reflects a project&apos;s current public link: when one exists it shows the full, absolute URL with click-to-copy and a Revoke control and no longer offers to create another; when none exists it offers create. Adds a reusable `ShareLinkManager` component (export) so a host can render the same UI in its own team/access panel. (@molecule/app-locales-ide@1.1.5)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-20</title>
      <link>https://www.molecule.dev/changelog#2026-08-20</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-20</guid>
      <pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate>
      <description>5 changes: minor: Add an `extraCommands` prop to `ChatPanel` so a host can merge its own slash commands into the command menu, `/help`, and the keyboard dispatcher alongside the shared registry. Selecting one fills the input with `/&lt;id&gt; ` for the host&apos;s own handler to run; ids must not collide with a built-in command. (@molecule/app-ide-react@1.4.0); patch: Add translations for the parameterized `/scripts` panel keys, the chat queued-count label, item render errors, and the peak-hour keys across all supported languages. (@molecule/app-locales-ide@1.1.4); patch: Apply a pending update by reloading only once the new service worker actually controls the page, instead of on a fixed 100ms timer that could reload onto the old cached build. (@molecule/app-version@1.0.2); …</description>
      <content:encoded><![CDATA[<ul><li>minor: Add an `extraCommands` prop to `ChatPanel` so a host can merge its own slash commands into the command menu, `/help`, and the keyboard dispatcher alongside the shared registry. Selecting one fills the input with `/&lt;id&gt; ` for the host&apos;s own handler to run; ids must not collide with a built-in command. (@molecule/app-ide-react@1.4.0)</li><li>patch: Add translations for the parameterized `/scripts` panel keys, the chat queued-count label, item render errors, and the peak-hour keys across all supported languages. (@molecule/app-locales-ide@1.1.4)</li><li>patch: Apply a pending update by reloading only once the new service worker actually controls the page, instead of on a fixed 100ms timer that could reload onto the old cached build. (@molecule/app-version@1.0.2)</li><li>patch: Claim clients when the new service worker activates, so the &quot;Update&quot; prompt reliably reloads onto the new build once the worker takes control. Also remove the `/api/` runtime-caching rule, which broke on streaming (SSE) responses and cached authenticated API data. (@molecule/app-vite-config-default@1.0.2)</li><li>patch: Reload only after the new service worker takes control. Clicking &quot;Update&quot; could previously reload before the waiting worker activated, leaving the old cached bundle in place until another refresh. (@molecule/app-pwa-default@1.0.2)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-19</title>
      <link>https://www.molecule.dev/changelog#2026-08-19</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-19</guid>
      <pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate>
      <description>6 changes: patch: Add the `ide.chat.queuedCount` translation key. (@molecule/app-locales-ide@1.1.2); patch: Add translation keys for the parameterized /scripts panel. (@molecule/app-locales-ide@1.1.3); patch: Anchor queued chat messages above the composer with compact rows. (@molecule/app-ide-react@1.3.3); …</description>
      <content:encoded><![CDATA[<ul><li>patch: Add the `ide.chat.queuedCount` translation key. (@molecule/app-locales-ide@1.1.2)</li><li>patch: Add translation keys for the parameterized /scripts panel. (@molecule/app-locales-ide@1.1.3)</li><li>patch: Anchor queued chat messages above the composer with compact rows. (@molecule/app-ide-react@1.3.3)</li><li>patch: Make gpt-5.6-luna the free-tier planner and drop minimax-m3&apos;s stale free-tier region carve-out. (@molecule/api-resource-ai-models@1.2.5)</li><li>patch: Parameterized scripts and built-in commands in the /scripts panel, plus ShareModal copy-button alignment. (@molecule/app-ide-react@1.3.4)</li><li>patch: Transparent OAuth divider label — flanking hairlines instead of a background-color mask. (@molecule/app-oauth-buttons-react@1.0.2)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-18</title>
      <link>https://www.molecule.dev/changelog#2026-08-18</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-18</guid>
      <pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate>
      <description>9 changes: patch: `SubscriptionUpdateParams.items[]` now types the optional `quantity` a subscription update may set. (@molecule/api-payments-stripe@1.2.2); patch: ChatPanel: drop a `requiresSignup` limit banner once `isAnonymous` is `false`, so a viewer who signs in mid-session no longer sees the guest-tier limit and its dead-end sign-up buttons. (@molecule/app-ide-react@1.3.2); patch: Checkout sessions now attach their metadata to the subscription they create, so subscription webhooks can be matched to the buying account on a first purchase. (@molecule/api-payments-stripe@1.2.1); …</description>
      <content:encoded><![CDATA[<ul><li>patch: `SubscriptionUpdateParams.items[]` now types the optional `quantity` a subscription update may set. (@molecule/api-payments-stripe@1.2.2)</li><li>patch: ChatPanel: drop a `requiresSignup` limit banner once `isAnonymous` is `false`, so a viewer who signs in mid-session no longer sees the guest-tier limit and its dead-end sign-up buttons. (@molecule/app-ide-react@1.3.2)</li><li>patch: Checkout sessions now attach their metadata to the subscription they create, so subscription webhooks can be matched to the buying account on a first purchase. (@molecule/api-payments-stripe@1.2.1)</li><li>patch: DeepSeek pro and flash now carry their August 2026 rates, with peak pricing live in place of the staged schedule. (@molecule/api-resource-ai-models@1.2.3)</li><li>patch: Mark `gpt-5.6-luna` free-tier plan-eligible in the `us` region (`freeTierRegions: [&apos;us&apos;]`), so it can serve as a free-tier plan-mode default and free users may select it in plan mode. (@molecule/api-resource-ai-models@1.2.4)</li><li>patch: PreviewPanel: the steady-state health probe now allows 5s and requires two consecutive misses before treating the app as down, so a preview behind a remote edge is no longer reloaded on a single slow probe. (@molecule/app-ide-react@1.3.1)</li><li>patch: Serialize `tool_use` and `tool_result` message blocks as native `tool_calls` and `role:&quot;tool&quot;` messages instead of flattening them to placeholder text. Multi-turn agentic tool loops now receive real tool results, so models that previously looped on their first tool call and never finished can complete a tool-driven conversation. (2 packages)</li><li>patch: Subscription updates now set the line item quantity explicitly, so a seat-count change applies and a switch to a flat-priced plan no longer inherits the old quantity. (@molecule/api-payments-stripe@1.2.1)</li><li>patch: useChat: the auto-retry after a 5XX / transport drop now runs up to 8 attempts (5s, 10s, 20s, then 30s holds) so an interrupted turn resumes across a server restart. (@molecule/app-react@1.1.1)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-17</title>
      <link>https://www.molecule.dev/changelog#2026-08-17</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-17</guid>
      <pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate>
      <description>6 changes: minor: `createCheckoutSession` accepts a `quantity` for per-seat plans, and the idempotency key now includes it so changing the seat count starts a new session instead of replaying the previous one. (@molecule/api-payments-stripe@1.2.0); minor: `PATCH /users/:id/plan` accepts an optional `quantity`, passed to the payment provider for per-seat plans and clamped to a whole number of at least one. (@molecule/api-resource-user@1.4.0); minor: Add `chargeOffSession` for capturing a payment from a saved card without the customer present. Resolves the customer&apos;s default card (falling back to their most recently attached one), confirms off-session, and returns a normalized outcome with the decline code when it fails. Requires a stable `idempotencyKey` so a retry inside Stripe&apos;s 24h window returns the original PaymentIntent instead of charging again. (@molecule/api-payments-stripe@1.1.0); …</description>
      <content:encoded><![CDATA[<ul><li>minor: `createCheckoutSession` accepts a `quantity` for per-seat plans, and the idempotency key now includes it so changing the seat count starts a new session instead of replaying the previous one. (@molecule/api-payments-stripe@1.2.0)</li><li>minor: `PATCH /users/:id/plan` accepts an optional `quantity`, passed to the payment provider for per-seat plans and clamped to a whole number of at least one. (@molecule/api-resource-user@1.4.0)</li><li>minor: Add `chargeOffSession` for capturing a payment from a saved card without the customer present. Resolves the customer&apos;s default card (falling back to their most recently attached one), confirms off-session, and returns a normalized outcome with the decline code when it fails. Requires a stable `idempotencyKey` so a retry inside Stripe&apos;s 24h window returns the original PaymentIntent instead of charging again. (@molecule/api-payments-stripe@1.1.0)</li><li>minor: Add an optional `quantity` to `updateSubscription` so per-seat plans can bill more than one unit. (@molecule/api-payments@1.2.0)</li><li>minor: Custom chat cards can declare `coversLimitType`, and ChatPanel then hides such a card while its limit banner is stating the same limit, so one limit is never shown twice. (@molecule/app-ide-react@1.3.0)</li><li>minor: New `captchaSlot` / `captchaSolved` props render a human-verification challenge in the signup form and gate its submit, so an API that requires a verification token can be used from the in-app modal. (@molecule/app-auth-modal-react@1.1.0)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-16</title>
      <link>https://www.molecule.dev/changelog#2026-08-16</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-16</guid>
      <pubDate>Sun, 16 Aug 2026 00:00:00 GMT</pubDate>
      <description>29 changes: minor: `PlanUpdated` now confirms the purchase a checkout redirect returns with, showing a spinner while it is in flight and a retry if it fails. New `provider` and `verify` props. Requires `@molecule/app-react` ^1.1.0. (@molecule/app-plan-updated-page-react@1.1.0); minor: `PlanUpdatedPage` now confirms the purchase a checkout redirect returns with, showing a spinner while it is in flight and a retry if it fails. New `provider` and `verify` props. Requires `@molecule/app-react` ^1.1.0. (@molecule/app-legal-pages-react@1.1.0); minor: `POST /portal` no longer passes a caller-supplied `returnUrl` straight to the payment provider — the provider renders it as a link on its own domain, so an arbitrary one was an open redirect. Send an app-relative `returnPath` instead; a `returnUrl` is honored only when it is already on the app origin. (@molecule/api-billing-routes@1.1.0); …</description>
      <content:encoded><![CDATA[<ul><li>minor: `PlanUpdated` now confirms the purchase a checkout redirect returns with, showing a spinner while it is in flight and a retry if it fails. New `provider` and `verify` props. Requires `@molecule/app-react` ^1.1.0. (@molecule/app-plan-updated-page-react@1.1.0)</li><li>minor: `PlanUpdatedPage` now confirms the purchase a checkout redirect returns with, showing a spinner while it is in flight and a retry if it fails. New `provider` and `verify` props. Requires `@molecule/app-react` ^1.1.0. (@molecule/app-legal-pages-react@1.1.0)</li><li>minor: `POST /portal` no longer passes a caller-supplied `returnUrl` straight to the payment provider — the provider renders it as a link on its own domain, so an arbitrary one was an open redirect. Send an app-relative `returnPath` instead; a `returnUrl` is honored only when it is already on the app origin. (@molecule/api-billing-routes@1.1.0)</li><li>minor: `SandboxConfig` gains `command` (the sandbox&apos;s main process, instead of the image&apos;s), `restartPolicy`, and `selfDeliveredEnv` (env the caller delivers itself, which a provider validates but must never persist in its own configuration). (@molecule/api-code-sandbox@1.2.0)</li><li>minor: `spawn()` accepts `pty: { cols, rows }`, creating the exec with a TTY so Ctrl-C interrupts the foreground job, streaming the raw (unmultiplexed) terminal bytes, and exposing `handle.resize({ cols, rows })`. (@molecule/api-code-sandbox-docker@1.1.0)</li><li>minor: `spawn()` now takes `SpawnOptions`, which adds `pty: { cols, rows }` for a process with a real controlling terminal, and `SpawnHandle` gains an optional `resize({ cols, rows })` for it. Providers that cannot allocate a PTY must reject the spawn rather than return pipes, so a caller can feature-detect a terminal. (@molecule/api-code-sandbox@1.2.0)</li><li>minor: `verifyEgress()` now reads the app&apos;s network policy back from Fly, so the verdict names every allowed port as reachable to any host — a Fly policy matches protocol and port with no destination — and reports `open` when the policy in force allows a port this provider never configured. Adds `reconcileEgressPolicy(app)`, which re-applies the current policy to an app that already exists. (@molecule/api-code-sandbox-flyio@1.2.0)</li><li>minor: Adds `POST /users/:id/billing-portal/:provider`, which opens the bonded provider&apos;s hosted billing portal so a subscriber can update their card, read invoices, and cancel. Returns `{ url }`; an optional `returnPath` sends them back to a specific app page. Requires `@molecule/api-payments` ^1.1.0. (@molecule/api-resource-user@1.3.0)</li><li>minor: Adds `resolveCheckoutRedirectUrls` and `resolveBillingPortalReturnUrl`, which build the URLs a hosted checkout or billing portal returns the buyer to from the APP origin (`APP_ORIGIN`/`ORIGIN`) — configurable with `PAYMENTS_PLAN_UPDATED_PATH`, `PAYMENTS_CHECKOUT_CANCEL_PATH` and `PAYMENTS_BILLING_RETURN_PATH`. (@molecule/api-payments@1.1.0)</li><li>minor: Adds `spawn()` — a long-running process with streaming stdout/stderr, writable stdin and `kill()`, plus `pty: { cols, rows }` for a real terminal where Ctrl-C interrupts the foreground job and `resize()` renegotiates the width. `exec()` now starts every command in the background and waits on its handle, so a launch that leaves a detached child behind returns its real exit code immediately instead of blocking until the deadline, and a command ending in `&amp;` reports its actual output and exit code instead of a fabricated success. (@molecule/api-code-sandbox-e2b@1.2.0)</li><li>minor: Adds `useVerifyPaymentReturn`, which confirms a purchase with `POST /users/:id/verify-payment/:provider` after a payment provider redirects back to the app, reading the transaction id a provider left in the query. (@molecule/app-react@1.1.0)</li><li>minor: Map `SandboxConfig.command` onto the container&apos;s `Cmd` and `restartPolicy` onto its Docker restart policy, so a container the daemon restarts comes back running the caller&apos;s own process. (@molecule/api-code-sandbox-docker@1.1.0)</li><li>minor: Map `SandboxConfig.command` onto the Machine&apos;s `init.exec` and `restartPolicy` onto its restart policy, so a Machine Fly restarts comes back running the caller&apos;s own process. Adds `find()`, which enumerates managed Machines app-by-app and throws rather than returning a partial result. `selfDeliveredEnv` is validated for private routes and never written into the Machine config. (@molecule/api-code-sandbox-flyio@1.1.0)</li><li>minor: New package: builds a CONNECT-capable HTTP(S) agent from the standard proxy environment (`HTTPS_PROXY` / `HTTP_PROXY` / `ALL_PROXY`, honouring `NO_PROXY`) for vendor SDKs that create their own HTTP agent and read no proxy variable. `getProxyAgent(url)` returns the agent, `getProxyAgents(url)` the `{ httpAgent } | { httpsAgent }` shape AWS SDK v3&apos;s `requestHandler` accepts, and `getProxyUrl(url)` the URL for clients that want it directly. All return `undefined` when the target is not proxied, so passing the result through is a no-op outside a proxied environment. (@molecule/api-proxy-agent@1.1.0)</li><li>minor: Persist a project&apos;s files beyond its sandbox: `create()` mounts a named volume at a caller-chosen path, `createVolume`/`removeVolume`/`volumeExists`/`listVolumes` manage volumes, and `commitTemplate`/`getTemplate`/`listTemplates`/`removeTemplate` capture and restore sandboxes as E2B snapshots. (@molecule/api-code-sandbox-e2b@1.2.0)</li><li>patch: `exec()` no longer blocks for its whole timeout when a command leaves something behind holding its output stream — a detached supervisor, a daemon that keeps its descriptors. It now checks whether the started process is still running and returns as soon as the command itself is over. (@molecule/api-code-sandbox-e2b@1.2.0)</li><li>patch: `hibernate()`, `stop()` and `sleep()` now pause the sandbox or throw — an SDK build with no pause method used to resolve a success-shaped `noop` outcome while the sandbox kept running. They prefer the supported `pause()` over the deprecated `betaPause()`, and treat an already-paused sandbox as success. (@molecule/api-code-sandbox-e2b@1.2.0)</li><li>patch: `PreviewPanel` now asks the preview host for a CORS-readable status before mounting the app, so an edge&apos;s &quot;unavailable&quot; error page is no longer mistaken for a working preview; hosts that do not serve `/__mol/preview-status` keep the previous behaviour. (@molecule/app-ide-react@1.2.6)</li><li>patch: `ShareModal` offers only the roles the host actually grants, via a new `roles` prop that defaults to `[&apos;viewer&apos;]` — a public link is an unauthenticated credential, so write access through one is opt-in. The role `&lt;select&gt;` renders only when there is a real choice; with one role the dialog states what the link will grant. (@molecule/app-ide-react@1.2.6)</li><li>patch: Approval now returns the buyer to the app&apos;s `/plan-updated` page instead of the API&apos;s verify endpoint, whose host holds no session cookie (the redirect answered 401 and the plan was never granted). Requires `@molecule/api-payments` ^1.1.0. (@molecule/api-payments-paypal@1.0.2)</li><li>patch: Checkout now returns the buyer to the app&apos;s `/plan-updated` page instead of the API&apos;s verify endpoint, whose host holds no session cookie (the redirect answered 401 and the plan was never granted), and the session carries `client_reference_id` + `metadata.userId` so the resulting customer can be linked to the account that paid. `createCheckoutSession` accepts `clientReferenceId`. Requires `@molecule/api-payments` ^1.1.0. (@molecule/api-payments-stripe@1.0.2)</li><li>patch: Correct the docs: `verifyEgress` is implemented and observes egress from inside a throwaway sandbox, rather than being unimplemented. (@molecule/api-code-sandbox-e2b@1.2.0)</li><li>patch: Record the 2026-08-15 re-verification of the Qwen3.8 Max US re-host rates, and why DeepInfra&apos;s open-weight `Qwen3.8-2.4T-A95B` is deliberately not carried alongside it. (@molecule/api-resource-ai-models@1.2.2)</li><li>patch: Route Elasticsearch requests through the outbound proxy when one is configured. `@elastic/transport` builds its own `undici` pool bound to the node origin, which bypasses the environment-driven global dispatcher, so on a host whose only egress path is a proxy every request failed with a bare connection error; the client now receives the proxy URL via its own `proxy` option, resolved against `ELASTICSEARCH_URL` so a self-hosted cluster listed in `NO_PROXY` keeps connecting directly. Nothing is passed when no proxy is configured. (@molecule/api-search-elasticsearch@1.0.2)</li><li>patch: Route S3 calls through the outbound proxy when one is configured. The AWS SDK v3 builds its own agent and reads no proxy variable, so on a host whose only egress path is a proxy every upload failed with a bare connection error; the client now receives a CONNECT-capable agent via its own `requestHandler` option, resolved against `AWS_S3_ENDPOINT` / `AWS_ENDPOINT_URL_S3` when set and the regional endpoint otherwise, so an internal S3-compatible endpoint listed in `NO_PROXY` keeps connecting directly. Nothing is passed when no proxy is configured. (@molecule/api-uploads-s3@1.0.3)</li><li>patch: Route SES calls through the outbound proxy when one is configured. The AWS SDK v3 builds its own agent and reads no proxy variable, so on a host whose only egress path is a proxy every send failed with a bare connection error; the client now receives a CONNECT-capable agent via its own `requestHandler` option, resolved against `AWS_SES_ENDPOINT` when set and the regional endpoint otherwise so `NO_PROXY` is honoured. Nothing is passed when no proxy is configured. (@molecule/api-emails-ses@1.0.2)</li><li>patch: Route SQS calls through the outbound proxy when one is configured. The AWS SDK v3 builds its own agent and reads no proxy variable, so on a host whose only egress path is a proxy every queue operation failed with a bare connection error; the client now receives a CONNECT-capable agent via its own `requestHandler` option, resolved against `SQS_ENDPOINT` when set and the regional endpoint otherwise, so a LocalStack endpoint listed in `NO_PROXY` keeps connecting directly. Nothing is passed when no proxy is configured. (@molecule/api-queue-sqs@1.0.2)</li><li>patch: Route Stripe calls through the outbound proxy when one is configured. The `stripe` SDK builds its own agent and reads no proxy variable, so on a host whose only egress path is a proxy every call failed with a bare connection error; the client now receives a CONNECT-capable agent via the SDK&apos;s `httpAgent` option, resolved against `https://api.stripe.com` so `NO_PROXY` is honoured. Nothing is passed when no proxy is configured. (@molecule/api-payments-stripe@1.0.3)</li><li>patch: Route the template object store through the outbound proxy when one is configured. The AWS SDK v3 builds its own agent and reads no proxy variable, so the S3 client now receives a CONNECT-capable agent via its own `requestHandler` option, resolved against the configured endpoint so a store listed in `NO_PROXY` keeps connecting directly. Nothing is passed when no proxy is configured. (@molecule/api-code-sandbox-flyio@1.2.0)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-15</title>
      <link>https://www.molecule.dev/changelog#2026-08-15</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-15</guid>
      <pubDate>Sat, 15 Aug 2026 00:00:00 GMT</pubDate>
      <description>13 changes: minor: `get()` now returns `null` only for a sandbox that does not exist and throws on any other failure, a new `describe(id)` reads a sandbox&apos;s record without connecting (so a status check never resumes a paused sandbox, and a paused one reports `sleeping`), and sandboxes are created with `onTimeout: pause` instead of E2B&apos;s default `kill`. `list()` skips paused sandboxes rather than waking them. (@molecule/api-code-sandbox-e2b@1.1.0); patch: `exportFiles(path)` now roots the archive at the last segment of `path` (`my-app/…`), matching the core contract and the Docker bond, and shell-quotes paths in `exportFiles`/`importFiles`. (@molecule/api-code-sandbox-e2b@1.1.0); patch: A throwing activity sink no longer changes a send&apos;s outcome: a real delivery still resolves, and a real failure still rejects with the real provider error. (4 packages); …</description>
      <content:encoded><![CDATA[<ul><li>minor: `get()` now returns `null` only for a sandbox that does not exist and throws on any other failure, a new `describe(id)` reads a sandbox&apos;s record without connecting (so a status check never resumes a paused sandbox, and a paused one reports `sleeping`), and sandboxes are created with `onTimeout: pause` instead of E2B&apos;s default `kill`. `list()` skips paused sandboxes rather than waking them. (@molecule/api-code-sandbox-e2b@1.1.0)</li><li>patch: `exportFiles(path)` now roots the archive at the last segment of `path` (`my-app/…`), matching the core contract and the Docker bond, and shell-quotes paths in `exportFiles`/`importFiles`. (@molecule/api-code-sandbox-e2b@1.1.0)</li><li>patch: A throwing activity sink no longer changes a send&apos;s outcome: a real delivery still resolves, and a real failure still rejects with the real provider error. (4 packages)</li><li>patch: Accept hyphenated table/column identifiers (e.g. `resource-share-links`). Every interpolation site quotes identifiers, so hyphens are safe; the previous allowlist rejected `@molecule/api-resource-share`&apos;s tables, making every share-link operation throw. (3 packages)</li><li>patch: ask_user cards now unwrap option objects the model pre-serialized as JSON strings (e.g. `&apos;{&quot;key&quot;: &quot;x&quot;, &quot;label&quot;: &quot;Build a new app&quot;}&apos;`) and render the label text, matching the existing object-option normalization. (@molecule/app-ide-react@1.2.3)</li><li>patch: ask_user option recovery also handles mangled pseudo-JSON with mixed escaping (a failed parse retries with collapsed escapes, then falls back to extracting the label key), so a weak model&apos;s malformed option payloads still render as readable labels. (@molecule/app-ide-react@1.2.4)</li><li>patch: ask_user option recovery prefers whichever JSON parse yields a recognized text key: a mangled option whose stray escapes make it parse into a label-less object now recovers its label via the collapsed-escape re-parse instead of rendering raw JSON. (@molecule/app-ide-react@1.2.5)</li><li>patch: Auth http-token sync now mirrors a null access token to the http client, so cookie-session logins can no longer keep authenticating with a stale bearer from the prior session. (@molecule/app-bonds-default-react@1.0.3)</li><li>patch: Catalog refresh: corrected US re-host rates (minimax-m3, qwen max models), deepseek-v4-flash defaults to its US re-host, peak surcharges only bill on the native provider, and notes for DeepInfra&apos;s -0813 snapshot pricing. (@molecule/api-resource-ai-models@1.2.1)</li><li>patch: Document both modes on the module docs: intercept-only never delivers, while wrapping a real provider delivers and records the real outcome. (5 packages)</li><li>patch: Document the `exportFiles` rooting contract: archives are rooted at the last segment of the exported path, and `importFiles(dirname(path))` is the inverse. (@molecule/api-code-sandbox@1.1.1)</li><li>patch: Log-in, sign-up and OAuth log-in responses no longer include secret user columns (confirmation/reset tokens, OAuth material) — the same denylist the self-read endpoints already apply. (@molecule/api-resource-user@1.2.1)</li><li>patch: useChat: re-check stream liveness when the app returns to the foreground, so a chat stream killed by a short screen lock is aborted and resumed within the silence threshold instead of waiting on the stall watchdog. (@molecule/app-react@1.0.3)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-14</title>
      <link>https://www.molecule.dev/changelog#2026-08-14</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-14</guid>
      <pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate>
      <description>13 changes: minor: `AuthClientConfig.shouldRestoreUser` lets an app reject a cookie-restored user and clear the stale presence hint, so an anonymous session cannot hydrate as a blank signed-in user. Defaults to current behaviour. (@molecule/app-auth@1.1.0); minor: `verifyMiddleware` accepts `{ shouldRefreshSession }`, letting an app skip the transparent token re-issue (and its presence hint) for sessions that must not appear signed in. Defaults to current behaviour. (@molecule/api-resource-user@1.2.0); minor: Model definitions can stage an announced price change with `scheduledPricing`: a dated rate card that replaces the base rates from its `effectiveFrom` instant. Pricing resolves per request, so the catalog is correct on both sides of a switch without an edit landed at the moment it takes effect. `GET /ai/models` serves whichever rates are billing now. DeepSeek V4 Pro and Flash carry the provider&apos;s 2026-08-16 rise, including its peak-hour windows. New exports: `effectiveBaseRates`, `effectivePeakPricing`, `withEffectivePricing`; `modelRegionRates` takes an optional instant. (@molecule/api-resource-ai-models@1.2.0); …</description>
      <content:encoded><![CDATA[<ul><li>minor: `AuthClientConfig.shouldRestoreUser` lets an app reject a cookie-restored user and clear the stale presence hint, so an anonymous session cannot hydrate as a blank signed-in user. Defaults to current behaviour. (@molecule/app-auth@1.1.0)</li><li>minor: `verifyMiddleware` accepts `{ shouldRefreshSession }`, letting an app skip the transparent token re-issue (and its presence hint) for sessions that must not appear signed in. Defaults to current behaviour. (@molecule/api-resource-user@1.2.0)</li><li>minor: Model definitions can stage an announced price change with `scheduledPricing`: a dated rate card that replaces the base rates from its `effectiveFrom` instant. Pricing resolves per request, so the catalog is correct on both sides of a switch without an edit landed at the moment it takes effect. `GET /ai/models` serves whichever rates are billing now. DeepSeek V4 Pro and Flash carry the provider&apos;s 2026-08-16 rise, including its peak-hour windows. New exports: `effectiveBaseRates`, `effectivePeakPricing`, `withEffectivePricing`; `modelRegionRates` takes an optional instant. (@molecule/api-resource-ai-models@1.2.0)</li><li>minor: setProvider/getProvider/hasProvider/requireProvider accept an optional provider name, so an application can bond multiple sandbox providers under the category (e.g. a separate &apos;production&apos; provider alongside the dev-sandbox singleton). (@molecule/api-code-sandbox@1.1.0)</li><li>minor: The model picker prices models on cache reads — the dominant cost in agentic traffic — instead of list input price alone, and flags models whose region is in a peak-surcharge window. (3 packages)</li><li>patch: `useChat` now recovers a chat stream interrupted by a screen lock or a backgrounded page, resuming from the server instead of staying silent until the stall watchdog fires. (@molecule/app-react@1.0.2)</li><li>patch: A preview UI command posted while the preview iframe is reloading is now re-sent as soon as the iframe reports back, so preview tools no longer time out in a hidden tab. (@molecule/app-ide-react@1.2.2)</li><li>patch: Add `ide.chat.itemRenderError`, shown in place of a chat message that could not be rendered, in all 79 languages. (@molecule/app-locales-ide@1.1.1)</li><li>patch: Deck export now refuses ICNS, JPEG XL and HEIF/HEIC images. The image measurement library used to embed images has unpatched denial-of-service flaws in exactly those three parsers, so images are checked by magic number — not just by declared MIME type — before they reach it. PNG, JPEG, GIF, BMP, SVG and WebP are unaffected. (@molecule/api-export-pptx@1.0.2)</li><li>patch: Default model is now `gemini-3.7-flash`, replacing the superseded `gemini-3.6-flash`. (@molecule/api-ai-google@1.0.2)</li><li>patch: Docker Compose commands are now time-bounded, so an unresponsive Docker daemon fails the call instead of leaving `up`, `down` or health checks pending indefinitely. (@molecule/api-staging-docker-compose@1.0.2)</li><li>patch: Secret redaction no longer rewrites ordinary source. File reads and search results now redact only `NAME=value` env assignments, so code such as `auth={authClient}` or `apiKeys: &apos;API keys&apos;` is returned verbatim instead of as `[REDACTED]`. Command output and `.env` reads keep the full env-dump treatment. New exports: `redactSecretsInCode`, `isEnvFilePath`. (@molecule/api-ai-tools@1.0.2)</li><li>patch: Tool cards no longer render raw tool input. A model-supplied field of the wrong type — for example an `ask_user` option sent as `{ label }` instead of a string — is coerced to its text rather than reaching JSX, and each chat timeline item renders inside its own error boundary so one unrenderable item cannot blank the chat. `ChatPanel` accepts `onRenderError` to report a caught item error to the host. (@molecule/app-ide-react@1.2.1)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-13</title>
      <link>https://www.molecule.dev/changelog#2026-08-13</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-13</guid>
      <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
      <description>9 changes: minor: Add `UIClassMap.touchTargetCompact` — a 36px coarse-pointer hit-area floor for inline CTAs in dense surfaces (banner/chat-card actions) where the full 44px `touchTarget` is visually heavy; chat notice-card actions with a semantic `color` now use it. (3 packages); minor: Chat notice-card actions accept an optional semantic `color` (`ChatEventCardAction.color`); colored actions render as standard ClassMap `cm.button` buttons so CTAs match the host app&apos;s other buttons. (@molecule/app-ide-react@1.1.0); minor: Model definitions accept `supersededBy`, naming the newer-generation model that replaces an older one. Superseded models are excluded from `MODEL_IDS`, `getAvailableModels()`, `GET /ai/models` and the client picker helpers — so only the newest generation of a family is offered — while `getModel()` still returns them so saved selections and past usage stay priceable. New helpers: `isSelectableModel()` and `resolveSelectableModelId()` (server), `isSelectableModel()` (client). The Alibaba AI bond now defaults to `qwen3.8-max`. (2 packages); …</description>
      <content:encoded><![CDATA[<ul><li>minor: Add `UIClassMap.touchTargetCompact` — a 36px coarse-pointer hit-area floor for inline CTAs in dense surfaces (banner/chat-card actions) where the full 44px `touchTarget` is visually heavy; chat notice-card actions with a semantic `color` now use it. (3 packages)</li><li>minor: Chat notice-card actions accept an optional semantic `color` (`ChatEventCardAction.color`); colored actions render as standard ClassMap `cm.button` buttons so CTAs match the host app&apos;s other buttons. (@molecule/app-ide-react@1.1.0)</li><li>minor: Model definitions accept `supersededBy`, naming the newer-generation model that replaces an older one. Superseded models are excluded from `MODEL_IDS`, `getAvailableModels()`, `GET /ai/models` and the client picker helpers — so only the newest generation of a family is offered — while `getModel()` still returns them so saved selections and past usage stay priceable. New helpers: `isSelectableModel()` and `resolveSelectableModelId()` (server), `isSelectableModel()` (client). The Alibaba AI bond now defaults to `qwen3.8-max`. (2 packages)</li><li>patch: `updatePlan` now logs every rejected plan update (with `errorKey` context) and analytics-tracking failures instead of silently swallowing them. (@molecule/api-resource-user@1.1.1)</li><li>patch: Add `UIClassMap.touchTargetCompact` — a 36px coarse-pointer hit-area floor for inline CTAs in dense surfaces (banner/chat-card actions) where the full 44px `touchTarget` is visually heavy; chat notice-card actions with a semantic `color` now use it. (@molecule/app-ide-react@1.1.1)</li><li>patch: Declare `@bufbuild/protobuf` (the major the E2B SDK&apos;s Connect RPC chain requires) so installs that skip automatic peer resolution — e.g. `legacy-peer-deps` — still place a compatible copy on the resolution path. (@molecule/api-code-sandbox-e2b@1.0.4)</li><li>patch: Kimi K3 is now available in the US processing region and defaults to it, priced at $2.85/$14.25 per MTok with cache reads at $0.285 — cheaper than the native host on every axis, with the full 1M context. Kimi K2.7 Code&apos;s US rates were re-verified and corrected to $0.68/$3.40 (cache reads $0.136). Every multi-region model&apos;s default region is now the cheapest one for real agentic traffic, enforced by a test. (@molecule/api-resource-ai-models@1.1.0)</li><li>patch: Mode surfaces now show the model that mode actually uses, and pending sends always carry the `automatic` flag — including kickoffs that were suppressed while a send was in flight. (@molecule/app-ide-react@1.1.2)</li><li>patch: Model definitions accept `supersededBy`, naming the newer-generation model that replaces an older one. Superseded models are excluded from `MODEL_IDS`, `getAvailableModels()`, `GET /ai/models` and the client picker helpers — so only the newest generation of a family is offered — while `getModel()` still returns them so saved selections and past usage stay priceable. New helpers: `isSelectableModel()` and `resolveSelectableModelId()` (server), `isSelectableModel()` (client). The Alibaba AI bond now defaults to `qwen3.8-max`. (@molecule/api-ai-alibaba@1.0.2)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-12</title>
      <link>https://www.molecule.dev/changelog#2026-08-12</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-12</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>3 changes: patch: ChatPanel: derive stick-to-bottom from the scroll position on the actual scroll event, not from touch direction. A streaming burst grows the content without firing a scroll event, so it can no longer be mistaken for the user scrolling up; the auto-pin keeps the live response in view while a deliberate scroll up (and back) still works. Replaces a touch handler that latched &quot;scrolled up&quot; on any downward drag. (@molecule/app-ide-react@1.0.5); patch: ChatPanel: keep the conversation pinned to the latest message when the chat container is resized (layout change, on-screen keyboard, orientation), not only when a new message arrives — so the live response never ends up scrolled out of view. Respects a deliberate scroll-up. (@molecule/app-ide-react@1.0.3); patch: ChatPanel: on mount, scroll to the latest message after layout settles. The panel remounts on the boot→IDE transition starting at the top, so the live response spinner sat below the fold until the user scrolled (mobile). Now it lands at the bottom once the transition finishes. (@molecule/app-ide-react@1.0.4)</description>
      <content:encoded><![CDATA[<ul><li>patch: ChatPanel: derive stick-to-bottom from the scroll position on the actual scroll event, not from touch direction. A streaming burst grows the content without firing a scroll event, so it can no longer be mistaken for the user scrolling up; the auto-pin keeps the live response in view while a deliberate scroll up (and back) still works. Replaces a touch handler that latched &quot;scrolled up&quot; on any downward drag. (@molecule/app-ide-react@1.0.5)</li><li>patch: ChatPanel: keep the conversation pinned to the latest message when the chat container is resized (layout change, on-screen keyboard, orientation), not only when a new message arrives — so the live response never ends up scrolled out of view. Respects a deliberate scroll-up. (@molecule/app-ide-react@1.0.3)</li><li>patch: ChatPanel: on mount, scroll to the latest message after layout settles. The panel remounts on the boot→IDE transition starting at the top, so the live response spinner sat below the fold until the user scrolled (mobile). Now it lands at the bottom once the transition finishes. (@molecule/app-ide-react@1.0.4)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-09</title>
      <link>https://www.molecule.dev/changelog#2026-08-09</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-09</guid>
      <pubDate>Sun, 09 Aug 2026 00:00:00 GMT</pubDate>
      <description>5 changes: patch: Drop `org_slug` from the shared-IPv4 assignment request so each sandbox app actually gets a public IP — without it the `&lt;app&gt;.fly.dev` preview URL never routed and the IDE hung on &quot;Loading preview…&quot;. (@molecule/api-code-sandbox-flyio@1.0.15); patch: Pace Machines API requests process-wide so a sandbox boot&apos;s burst of exec calls no longer trips Fly&apos;s account rate limit (429) and livelocks the boot. (@molecule/api-code-sandbox-flyio@1.0.14); patch: PreviewPanel: wait longer before flagging a preview as blank so a sandbox that is still cold-starting (or served through a preview proxy) is never falsely reported as &quot;didn&apos;t render anything&quot;. A real render still clears the overlay immediately. (@molecule/app-ide-react@1.0.2); …</description>
      <content:encoded><![CDATA[<ul><li>patch: Drop `org_slug` from the shared-IPv4 assignment request so each sandbox app actually gets a public IP — without it the `&lt;app&gt;.fly.dev` preview URL never routed and the IDE hung on &quot;Loading preview…&quot;. (@molecule/api-code-sandbox-flyio@1.0.15)</li><li>patch: Pace Machines API requests process-wide so a sandbox boot&apos;s burst of exec calls no longer trips Fly&apos;s account rate limit (429) and livelocks the boot. (@molecule/api-code-sandbox-flyio@1.0.14)</li><li>patch: PreviewPanel: wait longer before flagging a preview as blank so a sandbox that is still cold-starting (or served through a preview proxy) is never falsely reported as &quot;didn&apos;t render anything&quot;. A real render still clears the overlay immediately. (@molecule/app-ide-react@1.0.2)</li><li>patch: Retry `create`&apos;s machine POST through Fly&apos;s app-propagation 404 (&quot;app not found&quot;) so a freshly-created app no longer intermittently fails the sandbox boot. (@molecule/api-code-sandbox-flyio@1.0.13)</li><li>patch: Send only `type` (not `region`) when assigning a shared IPv4 — Fly rejects `region` for shared IPs with a 400, which left sandbox apps without a public IP so their preview URL never routed. (@molecule/api-code-sandbox-flyio@1.0.16)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-08</title>
      <link>https://www.molecule.dev/changelog#2026-08-08</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-08</guid>
      <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
      <description>7 changes: minor: Add optional `bio` and `avatar` profile fields to `OAuthUserProps`. (@molecule/api-oauth@1.1.0); minor: Map the user&apos;s display name and profile image (`picture`) from the Google userinfo response. (@molecule/api-oauth-google@1.1.0); minor: Map the user&apos;s display name, bio (`description`), and 400x400 profile image from the X profile via `user.fields`. (@molecule/api-oauth-twitter@1.1.0); …</description>
      <content:encoded><![CDATA[<ul><li>minor: Add optional `bio` and `avatar` profile fields to `OAuthUserProps`. (@molecule/api-oauth@1.1.0)</li><li>minor: Map the user&apos;s display name and profile image (`picture`) from the Google userinfo response. (@molecule/api-oauth-google@1.1.0)</li><li>minor: Map the user&apos;s display name, bio (`description`), and 400x400 profile image from the X profile via `user.fields`. (@molecule/api-oauth-twitter@1.1.0)</li><li>minor: Map the user&apos;s display name, bio, and avatar URL from the GitHub profile. (@molecule/api-oauth-github@1.1.0)</li><li>minor: Map the user&apos;s display name, bio, and avatar URL from the GitLab profile. (@molecule/api-oauth-gitlab@1.1.0)</li><li>minor: OAuth sign-up/login now persists the provider profile: display name (falling back to the email&apos;s local part), bio, and the profile image re-hosted as an inline data URI (never a third-party URL). Blank name/bio/avatar are backfilled on later OAuth logins without overwriting user-set values. (@molecule/api-resource-user@1.1.0)</li><li>patch: Fix Flycast private-address allocation: omit `org_slug` from the `ip_assignments` request. Fly derives the org from the target app and rejects an explicit `org_slug` with 400 &quot;organization not found&quot;, which blocked every sandbox from reaching its database. App creation still sends `org_slug` (that endpoint requires it). (@molecule/api-code-sandbox-flyio@1.0.3)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-07</title>
      <link>https://www.molecule.dev/changelog#2026-08-07</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-07</guid>
      <pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate>
      <description>1 change: patch: Update dompurify to 3.4.13 (fixes GHSA-55q2-fjhq-7xh7 and related sanitizer advisories). (2 packages)</description>
      <content:encoded><![CDATA[<ul><li>patch: Update dompurify to 3.4.13 (fixes GHSA-55q2-fjhq-7xh7 and related sanitizer advisories). (2 packages)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-06</title>
      <link>https://www.molecule.dev/changelog#2026-08-06</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-06</guid>
      <pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate>
      <description>3 changes: patch: Add Cloudflare Workers bonds: `@molecule/api-scheduler-cloudflare` and `@molecule/api-database-d1`. (3 packages); patch: Add the project-archive external-state bond for Cloudflare D1. (@molecule/api-project-archive-external-state-d1@1.0.2); patch: Move the nine optional provider wirings out of the package barrel and behind `./optional/&lt;pair&gt;.js` subpath exports. (@molecule/app-bonds-default-react@1.0.2)</description>
      <content:encoded><![CDATA[<ul><li>patch: Add Cloudflare Workers bonds: `@molecule/api-scheduler-cloudflare` and `@molecule/api-database-d1`. (3 packages)</li><li>patch: Add the project-archive external-state bond for Cloudflare D1. (@molecule/api-project-archive-external-state-d1@1.0.2)</li><li>patch: Move the nine optional provider wirings out of the package barrel and behind `./optional/&lt;pair&gt;.js` subpath exports. (@molecule/app-bonds-default-react@1.0.2)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Changes on 2026-08-04</title>
      <link>https://www.molecule.dev/changelog#2026-08-04</link>
      <guid isPermaLink="true">https://www.molecule.dev/changelog#2026-08-04</guid>
      <pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate>
      <description>1 change: patch: Ship the generated package documentation. (910 packages)</description>
      <content:encoded><![CDATA[<ul><li>patch: Ship the generated package documentation. (910 packages)</li></ul>]]></content:encoded>
    </item>
  </channel>
</rss>
