Release notes

What changed in each version, newest first. These are written in CHANGELOG.md and published with every release.

MyLo 0.5.2

v0.5.22026-11-05

Added

  • @ is now the one character for everything in the chat box. It lists files (type a few letters and the matching files in the project appear), folders and editor items, project and chat context, agents and, once you type, tools, in groups with an icon each. Picking one writes what the chat understands in place of the @ (#file:src/a.ts, ~codebase_search). #, ~ and / still work as before.
  • A Copy button at the end of every finished answer, so the whole answer can be copied from where you finish reading (the toolbar copy at its top stays). Each code block in an answer already has its own Copy button in its header, next to Insert at Cursor.

Changed

  • The separate "Generating…" line above the chat is gone. The answer's own header now says what the agent is doing: "Generating", "Running ops_exec · 12s", or "Waiting for you".
  • Time a tool call waits for your approval is counted on its own ("waiting for you · 12s", then "waited 12s" next to the run time) and no longer counts as the tool's run time.
  • The Stop button on a command row has a red outline and background.
  • The context ring next to Send is clickable and opens the chat's usage panel. The buttons around the chat input have a hover background and a pointer, Send is filled while there is something to send, and Stop is red.

MyLo 0.5.1

v0.5.12026-11-05

Fixed

  • 0.5.0 was packaged with an old copy of the app code, so it came without most of what its notes describe (live clocks, the Activity view, previews, Live Server, screenshots, the right-hand strip, the agent's job tools). This version has all of it. Packaging now stops when the app bundle is older than the code.
  • Opening a font, archive or other binary file no longer brings up "The file is either binary or uses an unsupported text encoding. Open anyway?" (it kept coming back when an agent worked with such files); a short note says the file was not opened as text.
  • The clock on a tool row now shows even when the tool's call id could not be matched, and the row's Stop button still finds its command.

Added

  • A running shell command shows a Stop button on its own row in the chat, next to its live clock. It ends that command only; the agent is told it was stopped and carries on.

MyLo 0.5.0

v0.5.02026-11-05

Added

  • A right-hand strip like the left one appears while background jobs run: the Activity view docks there (Stop, Restart, Output for each job and each running tool call) and the strip goes away when the last job ends. Opened by hand, the view stays.
  • Under a tool row that started a background job, the chat shows its state with Output and Stop buttons, so a server can be stopped right where the agent started it.
  • Web pages inside the editor. When a command prints a local address (npm run dev in a terminal or as an agent's background job: http://localhost:5173), the page opens in a new tab, one tab per site. Each tab has Reload, a page width (mobile, tablet, laptop), a screenshot button and Open in your browser. Setting mylo.preview.autoOpen (open, ask, off). AI > Open Preview... opens any address by hand.
  • Live Server. Right-click an HTML file in the Explorer or an open HTML file, then Open with Live Server: the folder is served on http://localhost:5500 and the page reloads when a file in it changes. Stop it from the Activity view or with Stop Live Server.
  • Screenshots. The camera button in a preview tab saves a PNG in .mylo/screenshots, copies it to the clipboard and offers to open it. In the desktop app it uses Electron's own engine; in the browser build it uses an installed Chrome, Edge or Brave.
  • Agents can look at what they build: the new tool web_screenshot captures a localhost page and returns the image to Claude models (other models get the saved file's path; setting mylo.preview.screenshotsToModel).
  • The Activity view lists the addresses a background job is serving (Preview button) and the running Live Servers.
  • Background jobs start with a look at the first moments: if a server dies at once (a port in use, a missing database) the result says so, with its output, instead of "started". New tool ops_job_restart stops a job and starts the same command again after a code change.
  • nohup ... and commands ending in & are refused with the advice to use background: true, so a server is never started where it cannot be watched, stopped or restarted.

Changed

  • Older tool results that are trimmed from the context keep their start and their end (the first and last lines), with a note of how much was cut from the middle, instead of only the start. Errors and a listing's last entries are no longer lost.
  • The agent's instructions now say: use background jobs and cwd for servers and subfolders; check what holds a port before starting or stopping anything; start a server's database and cache first; never use git stash or git checkout to find out whether an error was already there (compare with git show HEAD:path); keep line breaks when editing; and call the edit tool again with reset: true when it says "No changes needed" but the file still shows the old text. The claim that every file write asks the user first was removed because it is not always true.

MyLo 0.4.0

v0.4.02026-11-02

Fixed

  • The Mac app 0.3.1 closed itself at start-up (a Windows-only call, app.setJumpList, threw on macOS). It now only runs on Windows. If you downloaded 0.3.1, use this version.
  • Stop in the chat now ends a running shell command (ops_exec) instead of leaving it to run until its timeout. The agent is told the command was stopped and not to run it again.
  • The run's token limit no longer counts cached re-reads of the conversation, so a long chat is not stopped after a few steps. The limit is still mylo.ai.maxTokensPerRun.
  • While you edit, the code index is saved at most every 30 seconds instead of after every change, so large repositories no longer stall the backend. Edits made just before a crash are picked up again at the next start.
  • The code index is written to a temporary file and renamed, so a crash while saving cannot leave a broken index behind.
  • When a run stops at the token limit, Compact chat now carries on by itself once the summary is ready, so you no longer have to type "continue".

Added

  • Background jobs. ops_exec takes background: true to start a dev server, watcher or long build and return at once with a job id. ops_job_output shows the latest output (and only what is new on the next call), ops_job_stop ends the job, ops_jobs lists them. Running jobs show in the status bar with a list and a stop button (AI > Background Jobs), at most six at once, and all of them end when MyLo closes. Local only.
  • When the model refuses a request because it does not fit its context window (one huge tool result can do that), the chat is compacted and the run carries on, instead of stopping with an error. At most twice per message, and it follows the existing setting mylo.ai.compactDuringRuns.
  • ops_exec takes a cwd (relative to the repository, or absolute inside the workspace) instead of cd x && ....
  • A run that switches back and forth between two calls with unchanged results is stopped as going in circles, like one that repeats a single call.

Changed

  • Command rows in the chat show the command (and the environment, when it is not local) instead of a 30-character cut of the arguments. Same for log reads and container listings.
  • A timed-out command tells the agent how long it ran and what to do about it (raise timeout_seconds, narrow it, or leave long-running servers to a terminal).
  • Old command results that are trimmed from the context keep their last lines, where the error usually is.

MyLo 0.3.1

v0.3.12026-11-02

Changed

  • The Mac app is signed with a Developer ID certificate and notarized by Apple, so macOS opens a downloaded copy without the "unidentified developer" warning. Its identifier changed from app.mylo.editor to com.arvyo.mylo, so macOS asks once more for folder access (external drives, Documents) on first launch. The previous build's signature did not verify and macOS saw the app as "Electron", which made those permissions unreliable.

MyLo 0.3.0

v0.3.02026-11-01

Added

  • Several repositories in one workspace (File > Add Folder to Workspace, or a .theia-workspace file). Each chat is **pinned to one repository** (the first until you choose another; status bar chip, or **AI > Set Repository for This Chat...**, remembered per chat) and its search, read, plans and remote environments start there. Every folder is indexed, not only the first. codebase_search and codebase_read take a repo (a name, or all to search every repository); results show repo/path so the next call knows where to look, and a file that is missing from one repository says which repositories have it. A chat started by another agent follows its parent's repository. The agent prompt gets a two-line note about the repositories only in such a workspace; a single folder costs nothing extra.
  • Running agents show in the status bar: "1 agent running", "3 agents running · 1 needs you" (bell icon when an agent is waiting for your approval or an answer). It covers every chat, including ones in a collapsed or background panel. Click it (or **AI > Running Agents...**) for the list: each chat with its agent, what it is doing and for how long, chats that need you first and agents started by another agent shown under their parent; choose one to open it, or press the stop button to end its run. Nothing is shown while nothing runs. It replaces the old "2 chats working" item, which appeared only from two chats up and only opened the chat switcher.
  • Codebase Index page: **Saved indexes** shows how many folders have a saved index and how much space they take (they live in the app's data, never in a project), with **Clear all indexes** (also under AI). Old indexes clean themselves up: folders that no longer exist, folders not opened for 30 days, and indexes of empty folders are removed in the background at start, and no index is saved for a folder with nothing to index.
  • A moved or renamed repository starts from the saved index of the same repository (found by its first commit) instead of from nothing, and then reads only the files that differ.

Changed

  • Before any model is connected, the chat says "Connect an AI provider" with an **Open AI Providers** button, instead of Theia's text about missing language model packages and custom IDE distributions (which was wrong here: the provider packages are all installed, only no key has been added yet).
  • In a workspace with several folders, the approval dialog for an ops command names the repository it runs for ("local · write · repository web"), and its "don't ask again" choices say "in web".
  • Remote environments and .mylo/environments.json now belong to the repository of the chat that uses them, and a session choice to stop asking ("always allow on staging") covers that environment in that repository only. Before, the same name in another folder would have reused the choice. Commands and file edits from ops tools start in the calling chat's repository, not the one in focus.
  • SSH: when a command fails to connect or log in, the agent now gets the specific reason and fix (host key not trusted, login refused and which key to check, name not found, connection refused, connection lost while the command ran and it may have finished) instead of one generic hint; before, only the Test connection button explained failures. A host that stops answering mid-command is noticed in about 45 seconds (keepalive) instead of waiting for the command's own timeout.
  • Tool rows in the chat show what was read: codebase_read(…/codebase/codebase-index-service.ts:200-320) instead of a path cut after 30 characters, so a file read again and again is easy to spot. Same for file reads, file lists, file and code searches and diagnostics.
  • When the agent trims old tool results to save tokens, the note now says which call it was (codebase_read(src/a.ts:1-100)) and not to repeat a read it has already made, and an earlier result is dropped as soon as the identical call is made again later. Before, a trimmed result gave no hint of what it had held, so the agent read the same files over and over.
  • The top-left toggle now hides the left panel together with the Explorer/Search/Git icon strip, so the editor gets the whole width; showing it brings both back, and the choice is remembered. Opening the panel another way (a shortcut or command) shows the strip again by itself.
  • The agent is told to read a file in one go instead of many small ranges, not to re-read what is already in the conversation, and that older tool results are shortened so it should note what it needs. A run that read the same files again and again used up its 60 calls without changing anything.
  • The context ring next to the send button fills clockwise to how full the model's context window is, and the filled part is painted green through yellow to red around the circle, so a quarter full is green and nearly full is red. Theia's own ring was a single grey fill that only changed colour at two thresholds.
  • The note under a stopped run has a **Continue** button that carries on from where it stopped (it sends "Continue" for you), instead of only offering Compact chat and asking you to type "continue". After a token-limit stop both buttons show; after a call-limit stop only Continue; after the agent went in circles neither (it needs new instructions).
  • The hint above the chat input while the agent works is shorter: "Working. Press Enter to queue your next message, Esc to stop." The list icon and the "it is sent when this is done" text are gone.

Fixed

  • macOS now has a reason to show for opening folders on external drives, network volumes, Documents, Desktop and Downloads (the usage descriptions were missing from the app, so the permission prompt was unreliable). Not yet confirmed on a real external drive.
  • Opening a folder on an external drive no longer fails with "Cannot read properties of undefined (reading 'type')". When a drive returns no information for a folder (it answers slowly, refuses the read or was unmounted just before), Theia's file service crashed on the empty result instead of reporting a problem; it now raises the file-not-found error its callers already handle, so the folder either opens or fails with a message.

MyLo 0.2.2

v0.2.22026-10-31

Added

  • Syntax highlighting for popular languages out of the box: JSON, JavaScript, TypeScript, Go, Python, Shell scripts, YAML, HTML, CSS, C, C++ and C#. MyLo now bundles VS Code's built-in grammar extensions for them, so files open coloured instead of as Plain Text, and language features such as JSON validation and folding work. Before, only Markdown and Git support were bundled.
  • A **Recommended** starter kit in the Extensions view: GitLens, Prettier, ESLint, Python, Go, rust-analyzer, YAML, Tailwind CSS and TypeScript Next are suggested when the workspace defines no recommendations of its own. A workspace's own extensions.json still wins; suggestions can be dismissed as usual.
  • A status line above the chat input while the model works: **Generating…** during a request, and **Running <tool>…** while a tool call is in progress, with a stop button. It is hidden while the agent is idle, waiting for your action, or the run failed.
  • **New Window** in the taskbar/dock: right-clicking MyLo in the Windows taskbar or the macOS Dock offers opening a new window, like other apps do.

Fixed

  • The bundled VS Code extensions were not loaded: Theia's plugin deployer scans the configuration folder (e.g. ~/.theia/plugins), but the extensions downloaded with theia download:plugins are copied into the app's own plugins folder. The backend now points the deployer there, and a THEIA_DEFAULT_PLUGINS inherited from an installed MyLo no longer masks the folder of the app actually being run. Syntax highlighting now works in the app, not only in the browser build.

MyLo 0.2.0

v0.2.02026-10-31

Added

  • Markdown preview and media viewers. MyLo now bundles VS Code's built-in extensions for them: Markdown (syntax highlighting, **Open Preview to the Side**, $…$ and $…$ math rendered with KaTeX), Mermaid diagrams in fenced mermaid blocks (bierner.markdown-mermaid, pinned and checked before it was added: no network or process access in its own code), and a viewer for images (jpg, png, gif, webp, bmp, ico, avif), audio (mp3, wav, ogg) and video (mp4, webm). Before, .md files opened as Plain Text with no preview, extensions that build on the Markdown extension could not work, and media files had no viewer. The packaged app grows by about 58 MB (mostly Mermaid).
  • Maintenance tooling, documented in MAINTAINING.md: yarn verify:quick / verify / verify:package (types, tests, packaging list, size budgets, and a packaged app that is started and checked), yarn check:theia (does the installed Theia still have everything MyLo reaches into: patched methods, ids, preference keys, CSS classes; the list is scripts/theia-touchpoints.json), yarn theia:upgrade (shows where we are against npm, and with --to X --apply pins every @theia/* dependency, installs and runs the checks), size budgets (scripts/size-budget.json, yarn check:size), and a weekly CI job that warns when a newer Theia exists. The CI check job now also runs the types and tests.
  • INDEXING.md: a plan for where the code index should live. Short version: not in the repository (size, merge conflicts, wrong branch, embeddings, and an index that comes from the repo is untrusted input); keep it in app data but clean up old snapshots, key it by repository, and cache embeddings by content.
  • The Agent Inspector keeps its runs when MyLo restarts. Each run (what was sent to the model, the answers, tool calls and timings) is saved a second after it changes to ~/.theia/mylo-inspector.jsonl, readable by you only, and read back the first time you open the Inspector, so a restart costs nothing unless you look. Long text is cut and secrets that look like keys or passwords are masked before saving; treat the file as sensitive anyway. mylo.inspector.persist turns it off, mylo.inspector.keepRuns (default 50) sets how many runs are kept (the file is also capped at about 40 MB), and **AI: Clear Inspector Runs** (or AI History's clear) empties both the view and the file. A run too large to keep whole loses the messages of its middle calls and says so.
  • A code-level check that plans and todo lists agree. When the todo list is a copy of the chat's plan and a step is finished in the list but still open in the plan (or ticked in the plan and not in the list), the todoWrite result carries a reminder naming the exact lines to change, so /resume and the status bar, which read the plan, do not fall behind. When a plan of three steps or fewer is saved outside Plan mode, the result says a todo list would have done. Nothing is blocked.
  • Developer scripts for size and packaging: yarn report:bundle (size of the frontend by package), yarn check:packaging (is electron-builder.yml complete), yarn smoke:mac (start a packaged app and report errors and start-up time), yarn package:dir, yarn build:browser:prod. See PERFORMANCE.md.
  • Web search and page reading for chats: the tools web_search and web_fetch, offered to Mylo in every mode while mylo.web.enabled is on (default). Search uses Brave (mylo.web.braveApiKey), Tavily (mylo.web.tavilyApiKey), your own SearXNG (mylo.web.searxngUrl) or, with nothing set, DuckDuckGo, which needs no key but is the least reliable and can ask for a human check (the error then says to set a key). Pages come back as Markdown with navigation, scripts and ads removed, in parts of up to mylo.web.maxPageChars (the model asks for the next part). mylo.web.searchProvider, mylo.web.blockedDomains and mylo.web.allowPrivateNetwork round out the settings. Searches run without a question; a page address that came from a search result or from a link on a fetched page runs without one too, and any other address (one the model made up) asks first.
  • Safety of the web tools: only http(s); never localhost, private, link-local or cloud-metadata addresses unless mylo.web.allowPrivateNetwork is on (checked again for every redirect and when the connection is made, so DNS tricks do not get through); 3 MB and 20 second limits; PDFs, images and other binaries are refused with a clear message; page text is handed to the model with a note that it is untrusted. No JavaScript is run, so pages that build their content in the browser come back with an explanation instead of empty text.
  • A Copy button on every finished chat response (it appears on hover, next to Retry). Theia only had "Copy Message" in the right-click menu.
  • The hint above the chat input after the first message is now one small line, "New chat · New chat with summary", instead of "Keep chats short and focused. Start a new chat for a new task or start a new chat with a summary of this one."
  • The chat input has a visible outline when idle. Theia drew it in a colour that matched the panel in the dark themes, so the box looked like empty space.
  • The command classifier knows language toolchains and developer CLIs by subcommand instead of calling them all "changes state": Go (go, gofmt, goimports, golangci-lint), Rust (cargo, rustfmt, rustup), npm/yarn/pnpm/bun, pip/uv/poetry, Python formatters and linters, eslint, prettier, tsc, biome, deno, Maven/Gradle, Bundler/gem, Composer, dotnet, clang-format, shellcheck, shfmt, make. Listing, querying and checking is read-only and runs without approval where the environment allows it (go version, go vet, gofmt -l, npm ls, cargo tree, prettier --check, tsc --noEmit); installing, building and formatting in place (go fmt, gofmt -w, cargo build, npm install, eslint --fix) is a write; tests and scripts (go test, npm run, pytest, cargo run) are "unknown" because they run project code. An unlisted subcommand of a known tool is a write. Approval dialogs now say what the command does ("go fmt rewrites source files").
  • The AI commit-message button (sparkle) moved out of the message box to the right of the Commit button, where the other source-control actions are. Same conditions as before: git, something staged, AI on; the button is greyed with a tooltip when the Commit Message agent is switched off, and becomes a cancel spinner while it writes.
  • Reasoning effort per model: OpenRouter and other custom-endpoint models that their provider lists as able to reason now get Theia's reasoning selector in the chat box (Auto / Low / Medium / High; Auto sends nothing and leaves it to the provider). The level goes to OpenRouter as reasoning.effort. Before, the selector only appeared for models that declared support in settings, so there was no control for any custom model.
  • Long runs compact themselves: when one agent run fills the context window past the compaction threshold (75% by default), it is paused between steps, the chat is compacted, and a "continue" message carries it on in the same chat (mylo.ai.compactDuringRuns, also on Limits & controls). At most twice per message you write, so a summary that is itself large cannot loop. Before, auto-compact only looked after a reply finished, so one very long run could still run into the window.
  • Token Usage now shows an **Estimated cost**: a card for the period and a Cost column per model, provider or day. Prices come from the provider's model list (OpenRouter publishes them); for Anthropic, OpenAI and other direct providers add your own in mylo.ai.modelPrices (dollars per million tokens, e.g. { "anthropic/claude-sonnet-5-5": { "input": 3, "output": 15, "cacheRead": 0.3, "cacheWrite": 3.75 } }). Calls of models with no price are not counted as free: the figure gets a + and the card says how many were left out.
  • Old tool results are trimmed during a run: only the newest 8 (mylo.ai.keepToolResults, also on AI Configuration > Limits & controls; 0 turns it off) go to the model whole, older ones are cut to their first lines with a note that the tool can be called again. Every step re-sends everything before it, so a file read early in a long run used to be paid for again at every later step. The cut-off moves in steps of 8 so a provider's prompt cache stays valid between moves. Applies to OpenAI-compatible providers, OpenRouter included.
  • Source Control > Repositories (from five repositories up): a **filter** box (every word must be in the name or path, Esc clears it), a **sort** (Name, Changes first, Recently used), a **With changes** switch, an "N of M" count, and a **changed-files badge** on every row. Matching a nested repository keeps its parent in view. Your sort and switch are remembered. Before, repositories were listed in the order they were found, with no way to search or sort.
  • AI Configuration > **Limits & controls**: the run, context and cost settings in one place, with the default, what 0 does and why each exists next to the box, and a Reset link on anything you changed. Covers model calls and tokens per run, when a chat compacts itself, the longest answer, the longest tool result, shortened tool descriptions and prompt caching. Before, these were only plain mylo.ai.* entries in Settings.
  • Codebase Index page: a status card (Ready, Indexing with a progress bar, Error) with file and chunk counts and when it was last updated; **Try a search** to see what agents would be given for a question (file, lines, score, snippet, click to open); **What is left out** listing the skipped folders, lock files, binaries, credential files and size limits, taken from the real lists; and a progress bar while semantic search embeds.
  • Run guard: a run is stopped, with a note in the chat, when the agent calls the same tool with the same arguments and gets the same result four times in a row, when it passes 60 model calls (mylo.ai.maxCallsPerRun), or when it has used 2,000,000 tokens (mylo.ai.maxTokensPerRun). 0 turns a limit off. Before, the only brake was Theia's 100 model calls per request, which on a long chat is millions of tokens. The note has a **Compact chat** button right under it; after a stop, compact, then say "continue" or tell it what to try differently.
  • Token Usage page in AI Configuration rebuilt around the saved usage log, so history survives restarts (Theia's own page said "tracked since the start of the application and is not persisted"). Pick a period (today, 7 days, 30 days, all time) and group by model, provider or day; summary cards (total tokens, calls, output, share of input from the cache), a daily chart and a table with share bars.
  • Add Custom Agent is now a form: name, id (made from the name, checked against existing agents), a starting point (blank, code reviewer, researcher, docs writer), what it is for, instructions, model (default or any model), whether it shows in chat, and where to save it. Before, it asked for an id and wrote a placeholder agent named after the id.
  • Auto-compact: a chat compacts itself when a finished reply leaves it past a share of the model's context window (setting mylo.ai.autoCompactPercent, default 75, 0 turns it off). A notice says when it happens.
  • mylo.ai.maxOutputTokens (default 32768, 0 = off): OpenRouter requests that name no answer limit now get one, never more than the model can write. Without it the host reserved 36% of Kimi's window for the answer, and long chats failed with "prompt too large" at about 64% full.
  • File > Open Recent: the last ten folders listed right in the menu (current one left out), with "More..." for the full list. Before, only the "Open Recent Workspace..." quick-pick existed.
  • Agent Inspector shows durations: each model call has a badge with the time to the first output and the total time (hover for how long it spent generating), each tool call shows how long it ran (a failed one is marked), and the Tools tab has an average run time per tool. For ops_exec the time includes waiting for your approval. Recorded in memory, like the rest of the Inspector, so runs from before this release show no times.
  • Token usage is saved. Every chat model call appends a line to ~/.theia/mylo-token-usage.jsonl (time, provider, model, input, output, cache read, cache write, request id; no message text), so usage survives restarts and can be totalled per provider, model and day (AI > Open Token Usage Log opens it). Theia only kept this in memory.
  • Model browser, continued: lists are grouped by lab (OpenRouter's anthropic/…, google/…) with sticky headings, or sorted newest first when the provider is a single vendor (OpenAI, Anthropic, DeepSeek); a sort menu switches between grouped, newest and name. Rows show context size, price per million tokens (and cached price), release date, and badges for tools, reasoning, images and models that are retiring; ~vendor/…-latest aliases sit under their lab with a "latest" badge. Opening a model shows its description, limits, accepted inputs and, for OpenRouter, a "Served by" table of the providers behind it with price, uptime, location and links to each provider's privacy policy and terms.
  • Data and privacy card on the provider page: links to the provider's own policies (OpenAI, Anthropic, DeepSeek, OpenRouter, Hugging Face), and for OpenRouter a routing choice (mylo.ai.openRouterPrivacy: default, no prompt collection, zero data retention) sent as provider.data_collection / provider.zdr. The setting is kept when a request is retried. OpenRouter's API does not say whether a provider stores or trains on prompts, so MyLo shows the links and the routing control rather than guessing; if no provider matches the choice the error explains it.
  • Model browser on the AI Providers page. The provider's model list is fetched when you open the provider (no button to press), saved on disk and reused for a day, with the age shown and a **Refresh** button to ask the provider again. Search it by words (claude, llama 70b), filter to free models or models that can use tools, and click a model to add it. OpenRouter's list also shows each model's name, context size, price per million tokens, and whether it supports tools (models it says cannot use tools are marked, since agents need tools to edit files). If a refresh fails, the saved list stays and the reason is shown. Replaces the "Fetch from API" button and the fixed examples.
  • The command approval dialog can remember your answer for the session: "Don't ask again this session for changing (or read-only, or unrecognised) commands on <environment>", or for any command on it. Dangerous commands are never covered, hot fixes always show their diff, nothing is saved (a reload clears it), AI > Revoke Session Approvals undoes it, and the audit log records such runs as approved by session rather than user.
  • The classifier understands database and cache clients, so a read-only query no longer asks: psql -c, mysql -e, sqlite3 db "..." are read when every statement is a plain read (SELECT, SHOW, EXPLAIN, WITH, \d...), a change otherwise (INSERT/UPDATE/DELETE, SELECT ... INTO, FOR UPDATE, nextval, pg_terminate_backend, \copy, scripts with -f), and dangerous for DROP DATABASE/DROP SCHEMA; redis-cli reads (get, hgetall, info, scan, ...) run, set/del ask, flushall/flushdb/shutdown are refused. Works inside docker exec. Interactive use without a query stays "unknown".
  • Environments page in AI Configuration (AI > Manage Environments...): the servers and Docker engines of the project with their trust level (a dropdown), a **Test connection** button that explains a failure in plain words (untrusted host key, refused key, unknown host, no answer), add and remove, and **Import from your SSH config** (host names and routing only, including Included files; wildcard blocks are left out; imported hosts start as "ask before every command"). It edits .mylo/environments.json, keeps what it does not know, and refuses to overwrite a file that is not valid JSON.
  • AI > Add Ops Environment... (pick a host from your SSH config or type one). When the agent tries a raw ssh to a host that is not an environment yet, a notification offers to add it; if the host already is an environment, the agent is told its name.
  • Agent Inspector, new "Tools (all runs)" tab: for every tool, how often the model called it and how many tokens its definition costs on every request, with the tools that were offered but never called listed first. It shows the real cost of the tool list (about 4k tokens for 18 tools) and what trimming would save.
  • Prompt caching for Anthropic models used through OpenRouter: MyLo now asks the provider to cache the system prompt and the conversation so far (setting mylo.ai.promptCaching, on by default; turn it off in your user settings). If a provider rejects the request it is sent again without the markers and not tried again that session. Cached tokens that providers report (OpenRouter, OpenAI, DeepSeek) are now counted: the Agent Inspector and Chat Usage show how much of the input came from the cache, and the input figure no longer counts those tokens twice.
  • /incident <symptom>: an investigation workflow. The agent plans its checks, works read-only with ops_environments, ops_containers, ops_logs and ops_exec, writes each finding to .incidents/<incident>.md citing evidence ids (every command result now prints one; it matches an entry in the Ops audit log), ties it to the repository with ops_trace_locations (stack trace to workspace files) and ops_drift (repository file vs the file on a host, secrets masked), and ends with a report that lists its evidence and what it ruled out.
  • ops_hotfix: change one place in a file on an SSH host when you ask for a server fix. You see the exact diff and steps and approve (production-style environments also need the environment name typed); MyLo backs the file up, replaces it atomically keeping its permissions, runs an optional reload, runs your read-only verification, and restores the backup automatically if it fails. File content never appears in the audit log or reaches the model unmasked.
  • Docker environments for agents: "kind": "docker" in .mylo/environments.json points at the engine on this machine or, with host, one reached over SSH (optional docker context). New ops_containers tool shows every container's state, exit code, restarts and health in one table and calls out crash loops, OOM kills and failing health checks; ops_logs reads any container with the source container:<name>. docker exec is judged by the command run inside the container, so reading a log inside a container needs no approval but changing a file does.
  • Remote environments for agents: define SSH hosts in .mylo/environments.json (AI > Open Ops Environments creates a template). Each has a trust level (observe: reads only; approve-writes; approve-each, the default, where every command asks and you must type the environment's name). The agent gets ops_environments, ops_exec with an environment argument, and ops_logs (a named log source filtered on the remote side by time, pattern and last N lines). Connections use your own ~/.ssh setup (keys, agent, jump hosts); unknown host keys are refused rather than accepted. Hosts, users and key paths are never shown to the model.
  • Agent shell commands now go through a guard: every command is classified as read, write, dangerous or unknown; read-only commands (ls, grep, git log, docker ps, journalctl) run without a prompt, anything that changes something shows an approval dialog with the exact command, and dangerous ones (rm -rf /, curl | sh, dd, shutdown) are refused. Output is capped (head and tail kept) and secrets are masked before the model sees them. Every command, run or refused, is recorded in an audit log (AI > Open Ops Audit Log; the log holds a hash of the output, never the output). Setting mylo.ops.local.trust picks observe-only, approve-writes (default) or approve-each.
  • Agent Inspector (AI > Agent Inspector, or "Open Agent Inspector" in the command palette): every agent run, including background ones such as chat naming, with a timeline of model calls and tool calls (arguments, result size, flagged when large, rounds per call, tokens in and out, cached tokens when the provider reports them) and a "Context sent" tab that shows exactly what the model received, split into system prompt, tool schemas, messages and tool results with estimated sizes. "Copy JSON" exports a run. Records live in memory and are cleared on reload.
  • Folder references: type #folder:path (or pick one) or drag a folder from the Explorer into the chat. The model gets the folder's layout (names and sizes, 3 levels, at most 250 lines, without dependencies, build output, binaries or secrets) and opens files with its read tools, so a big folder costs a few hundred tokens, not its contents.
  • Plans open for building: a saved plan shows in the chat as a card (progress, its steps, **Build** and **View**), and .plan.md editors have a **Build** button on the tab bar. Build switches to Agent mode and sends /build for that plan (it waits in the queue when the agent is busy); View opens the file. Plans are saved as .plans/<title>.plan.md; chat summaries stay as .md in the same folder.
  • Message queue: a message sent while Mylo is still working waits in a list above the chat box (per chat), laid out like the Changed files list, and goes out when the agent is done instead of cancelling the running request. Per message: **steer** (stop the agent and send it now), edit, remove; right-click for those plus Move Up and Move Down, and Remove All. A stop or an error pauses the queue so a rate limit does not burn through the messages behind it; Resume continues.
  • Plans that survive interruptions: Plan mode saves the plan as a Markdown checklist in .plans/<title>.plan.md (editable in the editor), Agent mode ticks each step the moment it is done, and the bottom bar shows progress ("Demo plan 1/3"). **/resume** (or the bottom-bar item) carries on from the first open step in any chat, also after a restart or a new chat.
  • Bottom bar: "N chats working" when agents run in several chats at once, with a click to switch.
  • The bottom bar shows which AI provider and model chats use (click to change it), or "No AI provider" when none is connected. The AI Providers button in the top bar is a sparkle (the usual AI symbol), and turns into a disconnected plug when nothing is connected.
  • Split Editor button on the editor tab bar, **Cmd+\** to split, and **Open to the Side** (Cmd+Enter) in the Explorer's right-click menu. View > Editor Layout and the tab menu already had the split commands.
  • Fallback model: pick one on the AI Providers page and a request that keeps getting rate limited (429) or hits a provider error switches to it after a few quick retries. Works between OpenAI-compatible providers such as OpenRouter and Ollama.
  • The model picker in the chat box now lists every model of the providers you connected (before, it stayed empty). Free OpenRouter models are marked as free on the AI Providers page.
  • A notice on first start, when no model is connected, that opens the AI Providers page.
  • Mylo can now create and edit files, run workspace tasks, use git and run shell commands, using the tools from Theia's AI IDE package (file writes and shell commands ask for approval by default; Mylo has three modes: Ask and Plan are read-only, Agent can edit and run commands). AI is switched on by default.
  • OpenRouter and Hugging Face as built-in providers. Their model lists are public, so "Test connection" now also checks the key itself.
  • Compact Chat: summarises the conversation and carries on in the same chat (like Claude's /compact). The earlier messages stay on screen above a "Chat compacted" divider but are no longer sent to the model; it gets the summary instead. From the chat header, the Chat Usage panel and the AI menu.
  • Ollama as a built-in provider. It needs no API key and lists the models you have pulled.
  • Chat Usage panel (title bar, AI menu, chat header): context window fill, input/output/cache tokens and a breakdown of what is in the context. Theia's usage bar above the chat input is now on by default.
  • AI Providers is reachable from File > Preferences, the gear menu, the welcome page, a plug button in the title bar, and a link on the AI Features page in Settings (Theia moved the AI settings out of the Settings editor).

Changed

  • Agent mode is told to check files and config with the file tools, grep, jq, yq or docker compose config, and not with inline python3 -c code, which can never be checked and so always asks you first.
  • Agent mode no longer saves a plan file for every job with three steps. Small jobs (a few edits or commands) get only the short todo list in the chat, and the agent does not repeat the steps in its message; a saved plan is for big jobs (about six or more real steps, many files, work that may be interrupted, or when you ask for one). Verify, commit and push do not count as steps.
  • The AI commit message (sparkle button in Source Control) no longer sends lock files or generated output, and cuts very long files: a staged yarn.lock is one line saying how much changed instead of up to 2500 lines of diff, and the text tells the model what was left out. Shorter prompts, cheaper and more on point.
  • The approval dialog has one fixed width (640 px) whatever the command; long commands wrap inside it.
  • The remote-environment tools (ops_environments, ops_logs, ops_containers, ops_hotfix) are only offered to the Agent when the project has a .mylo/environments.json. Without one, every request is about 1k tokens smaller; ops_exec stays for local commands. (/incident still brings all ops tools.)
  • Tool results sent to the model are capped (setting mylo.ai.toolOutputLimit, default 24000 characters, 0 turns it off). Longer text keeps its start and end, and a note says how much was left out and how to ask for a narrower part. Before, a file read of up to 256 KB went to the model in full and was resent with every later call of the chat (a 100 KB file is about 25k tokens per call). Structured results are not cut.
  • Mylo's Agent mode runs shell commands with the new ops_exec tool instead of Theia's shell capability, and no longer switches that capability on at startup.
  • Tool definitions sent to the model are shortened (descriptions cut to the essentials, same tools, names and parameters): about 6.6k to 3.7k estimated tokens on every Agent-mode call, 7.9k to 5.0k in total. Setting mylo.ai.compactToolSchemas turns it off; compare both in the Agent Inspector.
  • Mylo's prompts were rewritten shorter (the Agent prompt is about half the size, about 1.3k tokens before your message), which helps small and free models. They tell the agent to re-read a file before editing it and to prefer targeted replacements, because other chats may be editing the same project.
  • The list of files Mylo changed in a chat is called "Changed files" and no longer shows an Apply All button while nothing is waiting. Each row still opens the diff, the original, or reverts the change.
  • Mylo's replies use the Milo avatar, and the internal prompt name next to it is hidden.
  • The Explorer no longer starts with the "Open Editors" list (the Explorer's "..." menu brings it back).
  • Chat Usage shows a percentage for every line (input, output and cache of what you are billed; your messages, replies, attached context and built-in instructions in the prompt), with a coloured bar for each, and explains when the built-in instructions and tools take most of the prompt.
  • The explorer starts with Theia's built-in file icon theme instead of "None", so files and folders have icons without installing anything. A theme you pick yourself still wins.
  • AI Configuration > Agents is grouped (Mylo, Specialist agents, GitHub, Setup and testing, Background tasks) with a checkbox to switch each agent, or a whole group, on or off. Background tasks are the helpers you never chat with, such as chat naming and commit messages. Theia's per-agent page (model, prompts) is one click away under Configure.
  • The @ agent, / command, # variable and ~ tool pick lists are grouped (Mylo first, then specialists, GitHub and so on), with the group name beside each item and its own icon.
  • Agent Request History opens as an editor tab instead of in the bottom panel where the terminal lives, and no longer opens by itself at startup.
  • Better errors from AI providers: when OpenRouter (or another OpenAI-compatible service) refuses a request, the chat now shows the provider's real reason and a hint (rate limit, prompt too large, no tool support, bad key) instead of just "Provider returned error". Failed requests are logged to ~/.theia/mylo-ai-debug.log (request size and shape only, never your messages or code); open it from **AI > Open AI Debug Log**.
  • Requests that get a 429 (rate limited) are retried up to 8 times with a growing delay instead of 3, which helps with busy free models.
  • One place for providers and keys: AI Providers is now a page inside AI Configuration, replacing Theia's "Providers & Models" page. The top-bar button, AI menu and Settings links all open it there. Codebase Index has its own page right below it.
  • Slash commands /review, /architect and /debug replace the separate Reviewer, Architect and Debugger agents. A Default model picker on the AI Providers page points every agent at your chosen model, so OpenRouter, Ollama and other providers work with Mylo (before, only Anthropic and OpenAI models did).
  • One agent: Mylo replaces the separate Mylo, Reviewer, Architect and Debugger agents and Theia's Coder. It is the default; Theia's other agents stay reachable by @Name.
  • The chat input no longer shows the "Toggle Capabilities Configuration" (tools) button or its panel.
  • The chat no longer has an icon in the right side bar. It opens from the title bar, and **Switch Chat...** (title bar and AI menu) lists your open chats.
  • The website loads brand icons from a CDN (Lobe Icons and Simple Icons, versions pinned) so every provider has its real logo.

Fixed

  • A faint rectangle behind the "Starting your editor" splash card. The splash is a transparent window; macOS drew its own shadow around it on top of the card's shadow, and the card's shadow reached further than the window and was cut off at its edge. The native shadow is now off for that window and the card's shadow fits inside the window. The start-up check (yarn smoke:mac) fails if the native shadow comes back.
  • The divider between the tree and the page in AI Configuration is now visible and easy to grab: a drawn line, a wider grab area, an accent colour on hover and while dragging. Before it was an invisible 1px line with a 4px grab area.
  • docker compose -f file.yml --env-file x config (and --profile, --project-directory, -p) is read correctly: the classifier took the option's value for the action and asked about "changing state". config, ps, logs with those options run without a prompt; up, down and restart still ask.
  • Shell loops and conditions made of read-only commands (for example for f in a b; do grep ... $f; done, while read l; do ...; done < file, if grep -q x f; then echo yes; fi) no longer ask for approval just because they use for/do/done. They are judged by the commands inside: a rm, a write redirect or a $(...) that writes in the body still asks. case, functions and arithmetic for ((...)) still ask. read counts as read-only.
  • Picking Mylo from the @ list now writes @Mylo in the chat box instead of @Coder (its internal id). Other agents are unchanged.
  • The chat now knows the real context window of OpenRouter and other custom-endpoint models (from the model list the Providers page caches, minus the reserved answer). Theia left it unknown and assumed 200k, so the usage panel, the token warning and the context bar were wrong for most models. Needs the provider's model list to have been loaded once.
  • The context-overflow message now says how much room the prompt has next to the reserved answer, instead of calling the provider's lower bound the prompt size.
  • Desktop app started with yarn start:electron is now called MyLo everywhere: Dock icon, About panel (name, version from electron-app/package.json, credits "Developed by Akib Khan"). Before it showed Electron's icon, name and version number. The packaged .dmg was already correct; its copyright line now names the author.
  • Failed model requests show a short explanation in the chat with a **Details** button for the provider's own message, instead of one long line. Context-window errors use the numbers the provider reports: window size, prompt size, and how much was reserved for the answer (before, the hint blamed the prompt when the answer reservation tipped it over).
  • Compact Chat no longer writes its summary into .plans; the summary stays in memory and only real plans are files. The "Summarize Current Session" button in the token warning now runs Compact Chat too, instead of Theia's own flow that saved a file and left the old chat in place.
  • The Chat Usage panel's context meter starts over after compaction (it counts only what is sent now) instead of still showing the full old chat.
  • Compact Chat no longer starts a new chat: it stays in the one you are in.
  • Commands MyLo cannot read (python3 -c ..., node script.js) say why they ask; python3 --version and -m json.tool run without asking.
  • A backslash inside double quotes was dropped when judging a command (psql -c "\\dt" looked like dt); it is kept unless it escapes $, a backtick, a quote or another backslash, as in a shell.
  • Theia's shellExecute tool is no longer handed to agents at all (setting mylo.ai.allowTheiaShellTool, off by default), whatever an old saved selection says, and without the extra reload the earlier cleanup needed. Its timeout is in milliseconds (a model passing 60 got a command killed after 60 ms and read the instant failure as "ssh is timing out"), and its deny patterns can be avoided by writing the command another way (/usr/bin/ssh ...): an agent did exactly that after a denial. Agents are also told not to look for another way around a refused or declined command.
  • Running ssh, scp or sftp through ops_exec is now refused with directions to add the server to .mylo/environments.json: what such a command does on the server cannot be classified, masked or audited, and without BatchMode a prompt just hangs. (A ssh -t dev ... run that "timed out after 60ms" was Theia's old shellExecute tool, whose timeout is in milliseconds; it is removed, see below.)
  • Theia's own shellExecute tool was still offered to the Agent, as a second way to run commands that skipped the new checks (classification, masking, audit): earlier versions had switched on its "shell-execution" capability in your settings and the selection stayed. It is now removed at startup (the first page load after updating still carries it; reload once).
  • A literal {{prompt:project-info}} was left in Mylo's prompts when nothing defined it; removed.
  • Sending a message now scrolls the chat to it, even if you had scrolled up (Theia stopped following the end of the chat once you scrolled away and only its arrow button brought it back). A queued message scrolls into view when it is sent.
  • While an agent works, a one-line hint above the chat box says that Enter queues your next message and Esc stops (the input only shows a Stop button then).
  • A blank strip at the right edge: the unused right-hand tab rail was hidden with CSS but the layout still kept its width, both beside the chat and, with chat closed, as an empty 48px column next to the editors. Editors and chat now use the full width.
  • The app did not finish starting when no model was connected yet (the very first start). Reading and writing the agent settings no longer holds up startup.

MyLo 0.1.0

v0.1.02026-10-16

Added

  • Desktop app for macOS (Apple silicon), packaged as a .dmg with a styled installer window and a launch screen.
  • The same editor in a browser tab (yarn start:browser).
  • AI chat in a side panel, with one chat window per agent (Mylo, Reviewer, Architect, Debugger) and a model choice per chat.
  • AI Providers screen: OpenAI, Anthropic, Qwen, DeepSeek, Kimi, GLM and MiMo, plus any OpenAI-compatible service. Test a key and fetch a provider's model list from one place.
  • Local codebase index and search. Chats can search and read your files. Optional semantic search is off by default.
  • MyLo Light and MyLo Dark themes that follow the system appearance.
  • Git through the VS Code git extension, search, an extension installer (Open VSX), Outline under Explorer, and layout buttons in the title bar.

Known issues

  • Chats can search and read your code but cannot edit files or run commands yet.
  • The Mac app is not signed or notarized; macOS asks you to confirm the first launch of a downloaded copy.
  • Provider presets (URLs, example model names) come from public documentation and have not all been tried end to end.
  • Only tried on macOS; the desktop build is Apple silicon only.