Local voice, phone access, persistent chats and indexed session history.
Breaking Changes
- coding-agent: persist sessions in version-3 directories containing meta.json, messages.jsonl and index.json. Explicitly opening a valid legacy session migrates it and retains its original JSONL backup; listing alone does not migrate. Older Loop versions cannot read new history. Session file accessors now identify meta.json; use SessionManager for reads and the collection accessor for session creation. See session storage.
Added
Web UI: support persistent chats without a project, using independent working directories and the existing history, pin, read and archive lifecycle. Replace the standalone welcome page with the shared chat workspace and keep the composer mounted through the first message. Add a Chats sidebar section; Chats, Pinned and Projects initially show five entries and reveal ten more per Show more action. Project selection remains available only before the first message.
Web UI: add a fixed New task button above the scrolling sidebar history, opening a new draft in the selected session's workspace, or an independent chat when no accessible project is selected. Align its icon with the Pinned heading, including with classic scrollbars.
Web UI: keep the Pinned heading at the top while sidebar sessions scroll, then stack Projects beneath it when reached; reverse naturally when scrolling up and use the top position for Projects when no pins remain. Clip session rows passing behind the headings while preserving the original sidebar background without solid-color blocks. Click Pinned or Projects to scroll to its first row below the sticky headings; Projects expands if needed, with folding retained on its separate chevron.
Voice build: automatically build, verify and publish engine/model packages, manifests and checksums to GitHub Releases when pinned voice inputs or build configuration change on main, or on voice-vX.Y.Z tags. Use explicit semantic resource versions for main pushes, keep manual runs build-only and replace same-name assets on existing releases with the latest verified build, uploading the manifest last and serializing voice workflows.
coding-agent and Web UI: add optional local streaming speech input and continuous voice calls, with editable dictation, automatic submission, interruptible spoken progress, queued follow-ups, atomic safe-boundary steering and explicit task cancellation. Preserve typed drafts, existing approvals and session history; hangup does not cancel accepted work. Add authenticated, bounded WebSocket audio for local, paired remote and development access, with single-use tickets, device-revocation cleanup and foreground recovery. Unify Voice settings field columns, compact control dimensions, typography and step spacing. Label the Voice steps Select features, Install components and Test; add a Features field label and align the compact, fixed-width feature dropdown and microphone test controls with their respective titles. Show Voice profile names and descriptions together inside the dropdown options and omit descriptive captions from the microphone test step. Match the microphone and Test audio label typography; share the feature/device dropdown component with menus matching the trigger width, including option spacing, hover states, selection marks and keyboard navigation. Place speech-preview and microphone sampling controls on separate labeled rows; show a compact capsule with reduced vertical padding, denser, smaller waveform dots, continuous volume-sensitive waveform movement with background-noise suppression and a higher saturation threshold, preserving peak height while distinguishing ordinary and louder speech and smaller grey circular backgrounds with unchanged icon and hit-area sizes for discard and stop controls, showing the microphone-test capsule only after preparation completes and listening begins, while the disabled microphone shows a smaller spinner ring during preparation without changing the icon size or position, replace the sampling capsule with persistent final text and a Retry action in the same row on stop, keep the leftmost X during recording to cancel and hide the sample, and show Retry only after recording completes to clear the previous result and record again on the same prepared microphone and engine connection and keep the microphone row height stable across preparation, recording and results with scrollable long text, automatically finalize each microphone test after 30 seconds of listening with a countdown outside the capsule on its right, reserving its width before recording and showing 30S only after recording starts, restart sampling from the microphone and discard cancelled samples without verification or visible status captions with accessible labels and hover titles. Provide a three-step Voice settings flow for component installation and microphone testing; enable voice entry once the required components are ready, keep Step 3 testing optional and direct disabled-button hovers to Settings component details. Retain browser-local test completion for the selected profile, microphone and resource versions, requiring a new test after changes. Show compact chat dictation sampling controls beside an audio-reactive orb in place of Send, preserving other composer tools, preserving the editable draft above, with red Discard and Stop icons in Light mode, softer coral-red icons in Dark mode, a denser waveform with smaller dots, real waveform feedback and a reserved 60-second countdown; buffer dictation until completion, then populate the editable draft, while cancellation preserves existing content. Place icon-only Voice input and Call actions immediately to the left of Send, with symmetric spacing; keep Voice input visible with typed or transcribed drafts so recording can restart after Stop. Keep Call black in Light mode. Replace the bottom toolbar during calls with live microphone waves and a rightmost End call icon, without a Discard action; play a quiet locally synthesized melody during initial connection and reduced-motion-aware wave animation during connection and reconnection, stopping the melody on readiness, cancellation or failure. Manage verified resources on the backend computer with resumable downloads, repair, updates and uninstall; retain license notices and prepare macOS ARM64 assets through a manual build workflow. Discover published resources through a bounded, versioned Release manifest with protocol, pinned-model, URL and integrity validation; preserve installed resources on discovery failure without copying generated catalogs into Loop. Audio is processed locally without saving recordings; submitted text still reaches the configured Agent.
Web UI: add a folder-icon Reveal action to the local session context menu, opening the saved session’s storage folder in the host file manager.
coding-agent: add indexed three-round history reads, append message bytes on ordinary saves, commit metadata separately, recover uncommitted tails and rebuild missing or stale indexes. Use writable positioned file handles for append and truncation on Windows. Preserve full-history model execution. Archive and restore retain all three storage files and legacy backups; deletion removes complete session directories, migration backups and traces together, restoring staged files if the archive update fails.
Web UI: load only the latest three conversation rounds in HTTP and event snapshots, fetching three earlier rounds per upward scroll with viewport preservation, retry and stream-change protection. Show a localized spinner and pause scrolling while fetching earlier messages; restore the visible message position before resuming, and preserve assistant component identity and tool expansion across prepends. Prioritize history requests, pause thumbnail sources during paging, decode images asynchronously and reserve media space to reduce loading contention and layout shifts. Keep live messages, timing and read receipts aligned with absolute history indexes; switching sessions resets the loaded window.
Web UI: preserve inline local-file links within their sentences as downloads, and turn standalone assistant Markdown links to local files into download cards, with native audio/video controls and PDF previews in a new browser tab. Serve session-referenced project and temporary files up to 512 MiB with device authentication, streaming and byte-range seeking; force other file types to download. Playback and PDF display depend on browser support.
Web UI: add installable production PWA metadata and icons, home-screen guidance, optional browser installation, explicit update/reload prompts and a themed offline page. Cache only validated static build assets; keep navigation, chat APIs, authentication and SSE online. Leave document navigation on private Dev Tunnels addresses to the browser so refreshes and Microsoft sign-in redirects retain the native navigation context; generic offline navigation remains available on other origins. Improve mobile safe areas, touch controls, scrollable approvals, wrapping composer controls and drawer focus isolation. Touch-keyboard Enter inserts a newline, with Send or Ctrl/Command+Enter to submit; switching chats no longer opens the touch keyboard automatically. See mobile layout and PWA.
Web UI: add experimental Dev Tunnels controls in Settings with verified official CLI installation, resumable downloads, managed uninstall, Microsoft sign-in/sign-out and private tunnel connection/disconnection. Show compact four-step setup and device pairing, completion/failure markers and localized inline progress for installation, uninstall, sign-in, sign-out, connection and shutdown; hide the service address and redundant status captions. Preserve partial downloads on Pause, validate resumed ranges and verify the pinned executable before installation. Uninstall removes only the managed executable and preserves CLI credentials. Sign out finishes tunnel shutdown before account logout. Persist sign-in and reconnect booleans, restore the persistent tunnel after backend restart when enabled, and avoid credential-store probes when opening Settings. Explicit account or host operations may require system credential approval; errors remain in the responsible step with manual retry. Keep control commands same-origin and cookie-protected. Automatically show a one-use QR invitation in Step 4 after Step 3 connects, renew it automatically on expiry while connected with no pending pairing request, and provide a single-arrow refresh icon beside Paired devices for manual replacement or retry without changing the tunnel URL. Generate a fresh code after reconnect. Place brief phone-scanning guidance beside Paired devices and show the QR image beside the paired-device list, without a pairing link; cap the list at the QR image height with vertical scrolling for additional devices. Keep Step 4 green while a valid device remains paired, show each device’s authorization expiry, and mark expired devices with a red cross and a re-pairing prompt; expired records remain removable until the next approval prunes them. Add isolated remote ingress with one-use QR invitations, phone requests and desktop confirmation codes, Secure HttpOnly device cookies, hashed credential storage, fourteen-day expiry and device revocation. Require exact Origin and CSRF checks for remote chat commands; terminate active HTTP/SSE access on revocation or tunnel disconnect. Unpaired devices see only pairing, while desktop configuration and project administration stay local. See setup and device pairing.
Fixed
CI: pin Linux verification to Ubuntu 24.04 so runner image upgrades do not break Bubblewrap sandbox preparation before repository checks start, preserving the existing required-check name so successful runs unblock merging.
Web UI: restore full-width waveform controls in place of composer tools during voice input and calls, adding an animated audio-reactive orb at the rightmost Send position while respecting reduced-motion preferences. Give Send and the orb the same fixed-size footprint without extra padding, use equal-sized, vertically centered idle voice and Send controls with a compact 4px gap between voice entries and an 8px gap before Send, and keep audio animation inside the orb without outward scaling; the model selector remains directly before Voice input.
Web UI: keep connection music looping during initial voice startup through direct audio output, separate from the speech media stream; readiness and cleanup immediately silence and disconnect all tone nodes, and subsequent reconnection stays silent.
Web UI: narrate complete voice-call replies and intermediate assistant text in ordered short segments instead of limiting replies to two sentences or dropping queued narration; retain unread updates until playback is ready. Start narration at completed streaming sentences and prefetch one synthesis segment during current playback to reduce startup and between-segment delays.
Web UI: route local voice playback through a managed media audio element to improve browser echo-cancellation compatibility while preserving live microphone capture and interruption; release playback tracks on failure or hangup.
Web UI: replace the lower voice-call panel with microphone, spoken-reply and correction icon controls in the composer toolbar, retaining a single red Stop control to end calls and removing the lower submission-status text row. Select correction by default on call start or resume, clearing it after the next submitted utterance.
Voice installation: report connection failures as download errors rather than generic resource-operation failures, preserving partial files for retry.
Voice settings: share in-flight Release discovery across concurrent status requests, retry unavailable catalog checks and retain installed engine readiness when discovery fails, preventing false unpublished-package states.
Web UI: reduce voice-input startup by preparing microphone capture and the backend concurrently, skipping unused TTS loading and integrity reads for dictation and microphone tests while retaining synthesis for calls and speech tests; clean up prepared calls on microphone failure or cancellation.
Web UI: replace whitespace-only composer drafts when inserting dictation so empty editor line breaks do not precede recognized text.
Web UI: close the local voice preview connection and release microphone capture when playback finishes, mute input during preview, label the playback test Test speech, show a compact spinner around its icon while preparing audio and display the sample text with a highlight following elapsed audio playback, and keep preview loading, completion and failures independent of microphone-test state and Step 3 completion.
Web UI: keep the microphone test Stop control available during intermediate phrase transcription; only explicit finalization disables Stop. Stopping chat or test dictation drains queued microphone frames and the final partial PCM frame before requesting recognition completion, while retaining the transcription connection until queued audio is finalized and explicitly acknowledged, then inserts the completed text instead of closing after 1.8 seconds or an earlier phrase result. Drive the microphone spinner from detected local speech energy while recording, retaining rotation through quiet speech and brief pauses with a lower continuation threshold and a 1.2-second silence hold instead of using intermediate transcription status; retain connection and finalization feedback.
Web UI: start Settings microphone samples in session-independent test mode and finalize their last phrase on Stop, avoiding startup rejection for a missing chat session.
Web UI: show one Voice Download icon button until all components are installed, then replace it with an Uninstall icon button; download installs speech synthesis even when the input profile is selected. Treat user-stopped installation as paused without a failure message, disable Download and provide a Resume icon to continue partial downloads from their retained percentages, reporting the on-disk offset before waiting for network data; verified installed packages retain completed markers during resume instead of flashing loading. Install independent packages concurrently, aggregate download progress, let unaffected packages finish after individual failures and wait for all workers before activation, cancellation cleanup or retry. Show four horizontal package markers with evenly spaced circles, single-line ellipsized package names underneath with full-name hover titles, detached horizontal separators, per-package percentages inside inner progress rings filling clockwise from the top with gradient strokes, subtle orbiting halos and looping comet highlights along the downloaded arc, green completion checks and a red failure cross with per-package error tooltips on hover or keyboard focus, with an info icon beside each package name showing only that package’s sizes, version and license on hover or focus, without storage paths or a trailing divider. Prioritize current package operation states and error reasons over installed-file readiness in info tooltips. Restore fixed-position tooltip styling so package details remain visible above Settings on hover. Place each Voice step title beside its step number. Place the installation action directly after its title above the evenly spaced packages, with per-package progress only and errors on a separate row.
Voice build: use the dedicated VOICE_RELEASE_TOKEN Actions secret for publication and report missing credentials explicitly, supporting release tag creation for commits containing workflow changes.
coding-agent: allow pinned voice model downloads through Hugging Face's AWS CDN and create nested model/license directories during clean asset preparation, while retaining exact-host redirect checks and size/SHA-256 verification.
Web development: keep the gateway, private Tunnel and device authorization alive across backend source reloads under
pnpm dev. Restart only the business worker, return a retrying recovery page during startup, and reject unavailable API calls without queuing or replaying commands. Automatically build the phone frontend on startup and rebuild after source or build configuration edits, debounce and serialize updates, and preserve the last successful frontend on failure. Browser disconnects and SSE termination during worker replacement avoid spurious abort/termination errors; unexpected failures and incomplete data responses still fail. Running generation is interrupted; production and direct Web startup retain their existing lifecycle.Web UI: bound remote startup authorization checks and chat downloads, exposing a retry action instead of waiting indefinitely. Reload the root page after a failed module download and provide an HTML fallback when startup scripts stall. Bound explicit PWA update activation with a reload fallback; on origins other than private Dev Tunnels, show the generic recovery page on navigation timeout or HTTP 503 as well as network failure. Preserve native private-tunnel navigation and authentication responses.
Web UI: remove the browser's brief touch-tap highlight on mobile and prevent long-press text selection across navigation, session lists, menus and action controls. Use the mobile layout below 768px and on coarse-pointer touch viewports up to 1024px, keeping portrait phones and unfolded compact foldables consistent across the sidebar, composer and Settings. Use a fixed mobile viewport and 16px base, message, session title and tool text, a larger composer and header, 44px toolbar controls and keyboard-resizing viewport metadata. Hide inline session pin buttons in mobile layouts while retaining pin actions in the context menu. Retain keyboard focus indicators and selection in messages, code, file contents, error details and text inputs.
Web UI: recover session and list streams after foreground return, network restoration and stale heartbeats, using bounded backoff and existing cursor replay/snapshots without replaying commands. Preserve loaded chats on transient authorization-check failures, show offline/retry guidance, and retain unconfirmed prompt identities after timeouts or HTTP 5xx. Delay reconnect guidance for two seconds so ordinary session switches do not flash warnings; show offline guidance immediately. Reject browser prompt submissions targeting an obsolete server stream before execution.
Web UI: display local raster images referenced by assistant Markdown through session-scoped image responses, including project screenshots and temporary images. Show message images as horizontally scrollable thumbnails with a larger preview, previous/next controls and detail inspection. Zoom around the selected image point on click or tap. Support image-only two-finger zoom and bounded dragging on phones without zooming the page; reset the view when switching images. Require an existing message reference, validate file boundaries and image signatures, and retain device authentication for phone access.
Web UI: preserve the private tunnel URL across reconnects and backend restarts by persisting the tunnel identity, verified origin and ingress port. Retain the cloud tunnel on disconnect, sign-out and uninstall, recover interrupted provisioning, and reject missing resources or occupied ports without silently changing addresses. Existing temporary tunnels need one new pairing at the stable address; same-browser device authorization then survives restart until expiry or revocation. Confirm fresh, stable cloud host connectivity before completing connection, check health every thirty seconds, and reconnect at the same address with bounded exponential backoff after host exit or confirmed disconnection. Keep Disconnect available during connection and recovery; stop, sign-out and shutdown cancel recovery; repeated failures remain actionable without opening account login.
Web development: keep the API and active sessions running when Vite configuration fails. Serve the last built frontend or a retrying unavailable page, retry frontend initialization on page requests, and exclude frontend build configuration from backend restarts. Build frontend assets in staging and publish only successful builds with atomic file replacement, retaining old hashed resources for open tabs and keeping the active frontend available through Node and Vite rebuilds.
Web UI: use root-served public icon URLs in development and production, avoiding Vite public-directory warnings while preserving theme-aware loading icons and static logo caching.
Web UI: keep the latest messages above the composer when the phone keyboard opens or closes while the conversation is at the bottom; preserve manual history positions and fit the mobile shell to the visible viewport.
Web UI: apply the saved or system theme and loading-screen background directly from HTML before application resources load, preventing a white flash on refresh. Show a 48px theme-aware Loop icon beside medium-weight 20px loading text from the initial placeholder through chat loading.
Web UI: preserve SSE anti-transformation headers on remote device connections so intermediaries are instructed to forward streamed chat updates without compression or response rewriting while keeping responses uncached.
Web UI: serve a lightweight standalone phone pairing page with the device-name form already in HTML, independent of chat downloads and authorization-check latency. Keep the pairing form hidden on ordinary refresh while checking authorization and loading chats, so paired devices return directly to chats; show a fresh QR invitation form immediately. After authorization, download the chat entry and shell in parallel and reuse the fresh in-memory authorization check. Defer Settings until opened and math/code highlighting until needed, keep ordinary messages readable during renderer downloads, and negotiate gzip for static scripts/styles. Distinguish a browser without a pairing request from an expired request, so opening a bare tunnel URL in a new browser or incognito window asks for pairing without incorrectly claiming expiry. Preserve an unsubmitted invitation in same-tab session storage for up to five minutes after capture so refresh does not lose it; clear it after submission or successful authorization, and keep server expiry and one-use checks authoritative. Retain localized pairing, comparison codes, retry guidance and ongoing access checks.
Web UI: serve the built frontend from the workspace Web package when pnpm dev hosts remote pairing, fixing the phone page returning 404 while the local Vite page works.
Web UI: preserve the original Host and Origin when starting Dev Tunnels so phone scans and pairing requests pass the isolated ingress checks instead of returning invalid_host or invalid_origin. Allow cross-site top-level navigation to the public pairing page after browser handoffs or sign-in redirects, retaining strict checks for APIs, frames, writes and foreign origins.
Web UI: remove the browser focus outline appearing between Model and Effort menu rows while retaining the theme-aware keyboard focus background.
Web UI: align all Settings section titles to a shared position and heading height so switching sections no longer shifts the title.