Initial Loop release with CLI, SDK and browser interfaces.
Breaking Changes
CLI, SDK and Web: require Node.js 24+ and replace Bun with pnpm, Vite, tsdown and Vitest. Move source modules into private workspace packages with enforced public dependency boundaries. The public root package is named @loop-harness/loop and ships a Node CLI, SDK and prebuilt Web UI through npx @loop-harness/loop web; the executable remains loop. Workspace consumers use @loop/agent and @loop/coding-agent; installed SDK consumers import @loop-harness/loop. Setup assumes a fresh installation, with no conversion of session or provider files. See development and distribution.
coding-agent: approval requests now wait indefinitely by default. ApprovalRequest.expiresAt and DEFAULT_APPROVAL_TIMEOUT_MS may be null; consumers must handle an absent deadline, or pass timeoutMs: 120_000 explicitly to set a bounded SDK wait. See approval deadlines.
coding-agent and Web: managed sessions and standalone mutating tools now default to read-only instead of unrestricted host access. Restricted Bash requires macOS Seatbelt or Linux Bubblewrap, blocks networking and filters inherited environment variables; unavailable sandbox backends fail closed. Session headers use version 2 with required permission metadata; other versions are rejected without rewriting data. Select workspace-write explicitly to allow workspace mutations, or danger-full-access only when unrestricted execution is intended; see permissions.
Added
Web UI: render Mermaid code blocks in assistant responses as borderless, theme-aware previews with no view toggle or source disclosure. Show a top-right copy icon on hover or keyboard focus, always available on touch devices, to copy the original Mermaid text. Keep its background transparent even on hover to blend into the preview. After successful copying, show a checkmark for three seconds before restoring the copy icon; each diagram has independent feedback and repeated copies restart the timer. Debounce streaming updates and fall back to copyable source on rendering errors. Use strict Mermaid security and SVG sanitization; keep response copying and saved history unchanged.
Web UI and coding-agent: pin or unpin sessions with a hover/focus icon button or the context-menu action below Rename, using a rounded diagonal pushpin outline in both locations. Show pinned sessions above Projects in most-recently-pinned order, without duplicate project entries, and keep them accessible when Projects is collapsed. Persist optional pinnedAt in each session header through SessionManager.setPinned(), preserving history and activity timestamps across concurrent saves. Return pin metadata in session summaries and synchronize browsers through list notifications, including collapsed projects and reconnects. Archive and project removal retain header pins for restoration. Remove browser pin storage and state without fallback; failed requests retain accepted state and refresh for recovery.
coding-agent: add session-owned approval requests with unique IDs, pending snapshots, allow-once/reject decisions, cancellation, indefinite waiting by default, optional explicit SDK timeouts, and paired approval events. Require an explicitly registered host interaction handler; missing or failing handlers, invalid/stale responses, and never policy cannot authorize requests. Cancel outstanding requests on abort, run completion or disposal, and never persist pending decisions or grants. Bind managed tool approvals to the actual call ID, validated arguments and operation scope. Allow one exact file replacement with path/content/identity rechecks, or one explicitly requested unsandboxed Bash invocation with host filesystem, network and environment access, while preserving the session preset. Protected storage remains denied to file approvals. Denial, timeout and cancellation prevent dispatch; queued file operations can cancel while another call awaits approval, and failed commands never automatically rerun with broader authority. Expose ApprovalOperation snapshots for review. Web and interactive CLI provide allow-once/reject controls showing exact arguments, reason and file or host-shell scope without an expiry countdown. Web approval summaries use Allow this operation with ${mode} permissions: ${justification}, with a localized prefix, the original model explanation and expandable operation details. Built-in file approvals expose optional permissionMode display metadata derived from the canonical target: workspace-write inside the workspace, danger-full-access outside; unsandboxed shell calls show danger-full-access. Labels do not change the exact-operation grant or session preset, and older requests without a tier retain generic copy. Write/edit accept an optional brief justification, falling back to the policy reason; explanations cannot grant authority and require no extra model call. Web approval cards use an orange rounded border, a tinted Waiting for approval header and right-aligned Deny/Allow once buttons; Allow once has a black background and white text. Web decision endpoints use local request checks; interactive connections share one handler per session, preserve existing pending requests across disconnects and session switches until a decision, cancellation or shutdown, and refresh after stale or uncertain responses without retrying execution. Print and piped input remain noninteractive. See approval APIs.
coding-agent: persist read-only, workspace-write and danger-full-access presets per managed session, expose idle-only SDK switching and permission_changed events, and support a new-session settings default. Constrain built-in writes with canonical path checks and atomic replacement, protect Loop storage, and sandbox Bash and descendants with private per-call temporary storage. Keep the system prompt stable by projecting durable runtime-context snapshots into model requests only on initial use or policy changes; restore their original positions without affecting displayed conversation history, titles or timing indices. Expose RuntimeContextSnapshot and SessionManager.getRuntimeContexts(), with optional context metadata in commit(). Built-in single-call approval requires an explicitly registered host handler; without one, additional authority is denied. Web adds an idle-only permission menu beside the attachment button below the input, with descriptions, a selected-state checkmark and an orange full-access indicator. Full access requires a separate confirmation dialog describing file, command and network scope; cancellation leaves the saved preset unchanged. Settings → General adds a server-persisted Permission default for new Web sessions across all projects, with matching shield icons, per-level descriptions, a selected checkmark, orange Full access styling and Full access confirmation; existing sessions and CLI/SDK defaults remain unchanged. CLI adds --permission-preset and /permissions, preserving saved presets on resume and leaving new-session defaults independent.
Web UI design assets: deliver the approved electric-blue Loop icon with editable SVGs, PNG sizes, monochrome marks, Web and macOS exports, and usage guidelines. Use the design in the sidebar, welcome screen, browser favicons and Safari icons. In-app icons switch between the primary charcoal tile with a white-to-blue mark in Light and a white tile with a charcoal-to-blue mark in Dark; System follows the browser preference while explicit selections take precedence. Reserve the icon artwork and application copies under a separate brand asset policy, excluding them from the software's MIT license; retain SIL OFL 1.1 licensing and attribution for the open-source guide fonts. Consolidate icon studies into the final asset package.
Web UI and coding-agent: archive a project's confirmed chat selection without deleting history and persist archive membership independently of conversation saves. Settings → Archived → Archived chats groups history by project with counts, timestamps, project/chat filters and Unarchive actions. Support confirmed deletion of one archived chat, a project's archives or all archives. Preserve drafts on archive and retain archives when re-registering a removed project.
Web UI: dismiss composer and session error notices, including run cancellation, with a close button while preserving drafts, attachments, validation, session outcomes and save recovery. New errors appear again, and dismissal does not carry over to another session.
Web UI: show a rotating ring at the right edge of session-list rows during response generation, then a blue unread dot for completed output that has not been viewed. While awaiting approval, show a yellow dot to the left of the session title and a static clock icon in place of the right-hand spinner, taking priority over generation and unread indicators and remaining visible across session switches. Clear the unread dot only when the latest content is visible in the focused conversation; selecting a chat alone does not mark it read. Web UI and coding-agent persist a boolean unread in each session header across browser changes and restarts, and synchronize indicators through list notifications. SessionManager.markRead checks the viewed message count inside the history write queue so stale receipts cannot clear newer output. Lists render unread directly, without completed-turn fields, read-position caches or a separate receipt file. Failed receipt saves remain unread and retry while the completed content is visible. Keep long titles truncated and respect reduced-motion preferences.
Web UI: attach UTF-8 text and code files through Add → Files or paste, preview or remove them before sending, and retain names and contents in conversation history and uncertain-delivery retries. Show sent files as compact filename pills with visible extensions and expandable contents. Send up to four text files without per-file, combined-text or prompt-body byte caps; reject unsupported formats, binary content and invalid encoding without truncation. Full text enters model context, with provider errors handled through the existing failure flow.
coding-agent and Web UI: generate durable conversation titles asynchronously from user prompts, with first-user-message fallback names for new and untitled historical sessions, manual renaming, explicit regeneration, and live header/sidebar updates. Empty sessions show New session. Web uses the first prompt; SDK hosts can choose first-prompt or all-prompts generation and a separate model. Failed or stale title requests do not replace accepted titles or affect the main conversation.
Web UI: add a Settings dialog with General, Models and Appearance tabs under Personal, and Archived chats under Archived. Use regular-weight gray group labels aligned with navigation icons, keyboard navigation and focus restoration.
Web UI: initialize the interface language from the browser's supported languages and remember manual Chinese or English selections without reloading or interrupting conversations.
Web UI: add System, Light, and Dark theme previews and persist the selected theme across visits. System follows browser color-scheme changes. Theme styling requires Chrome/Edge 123+, Firefox 120+, or Safari 17.5+.
Web UI: manage multiple built-in and custom providers with write-only credentials, three custom API protocols, model discovery and editable model metadata. Fetch adds all models from the matching built-in Provider ID catalog or the custom endpoint as editable rows, retaining gateway settings and existing edits. Expand rows to edit capacities or delete models before saving; empty custom model lists remain empty. Start the provider list empty and show only saved providers. Remember model selections for new conversations and preserve readable history when providers are removed.
coding-agent: expose provider catalog/runtime configuration and optional restoration of history with an unavailable model, while keeping prompt authentication checks.
Web UI and coding-agent: configure the model and supported reasoning effort from a popover beside Send, listing only saved providers' models under their display names, with search, keyboard controls, session persistence and remembered defaults. Use a compact 280px-wide popover that adapts to narrow screens. Custom models offer effort directly without a capability checkbox; Default sends no explicit reasoning settings.
Web UI, coding-agent and Agent: send image attachments from the composer using the picker or paste, preview/remove them, preserve them in session history and retain exact images on uncertain delivery. Provider forms no longer require image/reasoning capability switches.
Changed
- CLI, SDK and Web: minify distributed JavaScript, disable production source maps, strip generated source-location comments and check build and package contents for source files or recovery metadata. Preserve public SDK declarations and required licenses. These controls reduce source exposure; they do not prevent reverse engineering of locally distributed code.
- Web UI: compact project and session action menus with 28px rows, tighter padding and rounded corners. Use 13px labels and 20px icons, and narrow the session menu. Reduce project-row options/compose and session-row Pin/Archive buttons to 24px with 16px icons and smaller hover backgrounds.
- Web UI: reduce vertical spacing between user messages and their replies, reasoning sections or Looping indicators while preserving space for timestamp and copy controls.
- Web UI: center the input in new empty chats, with the theme-aware Loop icon and Loop everything stacked above it. Return the input to the bottom once the conversation starts, preserving drafts and composer controls.
- Web UI: initially show five sessions per project, with a localized Show more button that reveals ten more per click and disappears when all sessions are visible.
- Web UI: scroll each newly sent user message to the top of the conversation and keep the viewport steady while the response streams. Reserve space for short turns, preserve manual scrolling, and make Jump to latest a one-time action without automatic response following. Display it as a compact down-arrow button with a localized tooltip and accessible label.
- Web UI: replace user and assistant message Copy labels with a bottom timestamp and copy icon shown on hover or keyboard focus, keeping the controls visible on touch devices and preserving copy success/failure feedback. Use localized Copy message and Copy response tooltips for user messages and assistant replies, respectively.
- Web UI: expand reasoning sections by default for active turns and preserve their current expansion state when generation ends; restored history starts collapsed with its duration/status header. Keep nested execution timelines expanded when revealed. Limit reasoning items to 420px or half the viewport height, with an internal scrollbar only when content overflows and headings kept outside the scroll area. Show compact tool rows directly without the intermediate call-count accordion, labeling them with the actual file path or command and a localized action that follows execution state. Prefix each row with a read, write, edit, command or generic tool icon, independently of the status icon on the right. Keep long labels on one line with an ellipsis and full details available on expansion. Use tighter spacing between rows and action updates, with a 6px gap between execution steps so the next action heading stays close to the preceding tool batch, retaining their indentation and a left vertical line shortened at both ends, with a spinner during execution, a green check on success and a red cross on failure. Keep individual tool details collapsed initially and preserve expansion choices through completion and reconnect.
- Web UI and coding-agent: remove tool-description and before/after narration guidance from the default prompt. Keep each user turn's intermediate updates, thinking and tool batches in one collapsible execution section, with a shared timeline and a separate final answer. Stop the execution icon when reasoning ends without waiting for answer generation; resume it for subsequent reasoning or tools. Show live elapsed work time and failure counts; freeze duration when execution ends and persist it across refresh and history reopening. Expose optional runTimings metadata and run_timing lifecycle events; older sessions retain status labels without inferred durations. Use compact tool rows with adjacent input/output panels. When updates are absent, summarize single-action batches with call counts and mixed batches with distinct actions in first-appearance order, using the interface language without another model request; unknown tools retain their names. Preserve expanded details during streaming and reconnect, and keep streamed parameters current. Custom system prompts retain their replacement semantics. Remove the per-call Bash description parameter and its display parsing; Bash rows show the actual command, with streamed argument updates and a separate execution-status icon. Static tool capability descriptions and frontend-generated action headings remain.
- Web UI: replace five-second session-list polling with server-sent list change notifications. Refresh background titles, generation status, projects and archived chats across browser pages when they change; resynchronize lists on reconnect and batch bursts without fetching on each streamed token.
- Web UI: rebalance font sizes with 13px navigation, 14px chat text and input, 12px secondary labels and 18px settings headings. Use a 14px Projects heading with tighter spacing above the first project and 14px No chats placeholders. Keep project and session names at 13px, reduce oversized chat titles and retain 16px mobile input.
- Web UI and coding-agent: highlight session rows on hover and reveal a one-click Archive button. Add a right-click menu with inline Rename, immediate Archive and confirmed Permanently delete. Deletion failures stay inside the confirmation and clear on close or a new action, without leaving an error beneath the session title. Busy-project guidance explicitly includes deletion. Permanent deletion removes the selected chat's history and local drafts, including for unarchived chats; project files remain intact. SessionArchive.delete accepts archivedOnly: false to explicitly include unarchived history while retaining the archived-only default.
- Web UI: group all projects beneath a collapsible Projects heading with a down/right chevron, preserving the selected chat and individual project expansion states. Reveal the heading chevron and Add project button on hover or keyboard focus, keeping them visible on touch devices without shifting the layout. Use open/closed folder icons and a highlighted project row with hover/focus actions. Replace the project + button with a compose pencil and inline Rename/Remove links with a two-item Archive chats/Remove project menu, available through the … button or right-clicking the project row. Both menu items use the same neutral text and icon color. Both actions require confirmation; busy projects and failed requests retain their state.
- Web UI: give the project sidebar a frosted-glass background in Light and Dark themes, with translucent tint, backdrop blur and a soft edge. Use subdued gray for Projects and a softer No chats placeholder. Keep an opaque fallback when blur is unsupported or reduced transparency is requested.
- Web UI: replace routine session status labels above the input with Looping... at the end of the conversation during generation, using a left-to-right highlight animation with reduced-motion support. Keep the same label when translation resources are unavailable. Preserve reconnection, error and save-recovery notices.
- Web UI: move attachment upload into a lower-left + menu under Add → Files, preserving image selection, paste and previews. Align the input text, caret and attachment previews with the left edge of the + button's circular hover background. Change the input placeholder to Loop anything... and remove the visible keyboard shortcut hint.
- Web UI: simplify the conversation header to a folder icon matching collapsed project nodes and a session name closer to the folder icon and a background matching the conversation. Remove the extra gap between their controls while preserving click areas and title padding. Highlight the name on hover with horizontal text padding and edit it inline with Enter to save and Escape or blur to cancel, synchronizing the header and sidebar. Remove the project path and separate rename/regenerate buttons.
- Web UI: remove the model selector from the session header and place it in the input box.
- Web UI: replace the sidebar language selector with a Settings button. Use a compact rounded hover highlight with narrow side insets, translucent shading and balanced spacing above and below the row.
- Agent and coding-agent: use generic gateway, model, and credential placeholders in usage samples.
- Web UI: move the standalone model configuration entry into Settings → Models. Model menus show only configured providers. See provider storage.
Fixed
Web UI: prevent the unconfirmed-delivery warning from flashing during normal message submission or while waiting for SSE after HTTP acceptance. Keep duplicate sends blocked across session switches and preserve recovery for lost responses, reloads and server restarts.
coding-agent and Web: exclude unsupported session formats from discovery without modifying files, preventing one incompatible history file from blocking project lists and supported conversations. Clear stale active selections after a session-not-found response while preserving drafts and attachments, and show backend details for generic API errors.
Web UI: focus the chat input after creating or switching sessions and after sending a message, preserving the caret at the end of restored drafts without scrolling the page.
Web UI: keep a generating session's sidebar spinner visible when switching to another session or reconnecting. Preserve the last live status while refreshing the list, reject older in-flight list responses, and let background completion updates clear the spinner.
Web UI and coding-agent: stream the latest assistant reply outside the height-limited reasoning area immediately, without waiting for completion, requesting display markers or buffering unclassified text. Keep thinking, explicit commentary and identified tool batches in reasoning; if a later call identifies an unclassified text draft as an update, move it into its tool batch. Preserve reply placement through completion and reconnect, partial replies and errors on failure or cancellation, without changing raw messages. Follow live reasoning within its scroll area until the reader scrolls up. Keep tool rows visible before results with a spinner during execution and success/error icons afterward. Synchronously commit tool-start updates so event bursts cannot skip the running state, and briefly retain the live spinner for fast successes (200ms minimum) without delaying tool results, execution or answers; failures and restored history remain immediate. Preserve raw events/history and restore streaming placement and tool state on reconnect.
Web UI: align the reasoning section's left edge and the Looping indicator with the final answer text on desktop and narrow screens.
Web UI: align tool parameter and result panels to the same height when displayed side by side, preserving independent scrolling and the stacked layout on narrow screens.
Web UI: give the composer's + button and Send/Stop button matching 12px outer insets, keeping the circular hover and send backgrounds symmetrically spaced from the border and aligned with the input text's inset.
Web UI: remove the blue outline from dialog close buttons, including automatically focused project confirmation dialogs, and use a subtle background highlight for keyboard focus.
Web UI: keep Archived chats at the same Settings dialog width as General, Models and Appearance, avoiding resizing when switching sections.
Web UI: align sidebar session titles, inline rename text and No chats placeholders with their project names. Keep project and session names in the same theme-aware foreground color across default, hover, focus and selected states. Give project and session highlights matching widths and equal gaps to the sidebar edges, including when classic scrollbars are present, while retaining text indentation and a narrow gap between adjacent rows. Use compact 32px project headings, 2px project margins and reduced list padding to bring projects, their first sessions and the next project after a session or Show more closer together. Align the rightmost action buttons across Projects, project and session rows, using consistent icon sizes, spacing and hover styling, with a compact Add project plus glyph.
Web UI: immediately show and expand the added project, reopen the Projects group and scroll the folder into view. Re-adding a registered folder reveals its existing node without duplication; empty projects show No chats without creating a session.
Web UI: explicitly serve the approved Loop favicon for browser tabs and address bars with SVG, PNG and ICO assets. Add Safari Apple touch and pinned-tab mask icons at dedicated URLs, with revalidated routes and conventional icon fallbacks.
Web UI and coding-agent: keep New session as a draft until the first user message. Do not write empty Web history files or show drafts in the project list; include the conversation as soon as its first user message enters the live run, including attachment-only messages. Hide older unarchived history without user messages without deleting it. Add SessionManager.draft and userMessageCount summaries for this lifecycle.
Web UI: filter the attachment picker to supported image types and text/code extensions, excluding PDF, PowerPoint and other unsupported formats by default while retaining upload validation.
Web UI: right-align sent image attachments with the message bubble, removing unused space to the right of image previews.
Web UI: retain text and code attachments when pasted together with images instead of silently dropping non-image files.
Web UI: correct the composer model menu chevron to point down when closed and up when open.
Web UI and coding-agent: retain the model runtime thinking-level mappings for matching custom provider models, exposing supported Extra high and Maximum efforts and passing their mapped values to the configured gateway without changing connection settings.
Web UI: keep custom provider dialogs within the viewport with only the model list scrolling; connection fields, headers and actions remain fixed while fetching or expanding models.
Web UI: translate Settings titles, navigation, headings, and descriptions when switching languages. Refresh translations during development hot updates so new strings do not appear as raw keys.
Removed
CLI and Web: remove redundant development command aliases, the singleton provider API and storage conversion, and implicit Web model fallback to CLI environment settings. Web setup uses Settings → Models and the provider collection API.
Web UI: remove assistant reply avatars and their reserved column during streaming and in completed history, keeping replies, reasoning and the Looping indicator aligned.
coding-agent and Web UI: remove the prompt-specific text-marker protocol, prefix buffering, phase inference from text and marker stripping in rendering, copying, CLI and SDK output. Native assistant phase metadata remains supported. Existing marker strings are ordinary text; saved history is not rewritten.
Web UI: remove the Copy button beneath tool results.
Web UI: remove session tabs, their open/close state and cached titles. Switch conversations through the project sidebar; remember only the selected session across reloads. Preserve drafts, attachments during session switches, saved history and background runs.