# Changelog All notable changes to OpenHarness should be recorded in this file. The format is based on Keep a Changelog, and this project currently tracks changes in a lightweight, repository-oriented way. ## [Unreleased] ### Added - Built-in `minimax` provider profile so `oh setup` offers MiniMax as a first-class provider choice, with `MINIMAX_API_KEY` auth source, `MiniMax-M2.7` as the default model, and `MiniMax-M2.7-highspeed` in the model picker. - Docker as an alternative sandbox backend (`sandbox.backend = "docker"`) for stronger execution isolation with configurable resource limits, network isolation, and automatic image management. - Built-in `gemini` provider profile so `oh setup` offers Google Gemini as a first-class provider choice, with `gemini_api_key` auth source and `gemini-2.5-flash` as the default model. - `diagnose` skill: trace agent run failures and regressions using structured evidence from run artifacts. - OpenAI-compatible API client (`--api-format openai`) supporting any provider that implements the OpenAI `/v1/chat/completions` format, including Alibaba DashScope, DeepSeek, GitHub Models, Groq, Together AI, Ollama, and more. - `OPENHARNESS_API_FORMAT` environment variable for selecting the API format. - `OPENAI_API_KEY` fallback when using OpenAI-format providers. - GitHub Actions CI workflow for Python linting, tests, and frontend TypeScript checks. - `CONTRIBUTING.md` with local setup, validation commands, and PR expectations. - `docs/SHOWCASE.md` with concrete OpenHarness usage patterns and demo commands. - GitHub issue templates and a pull request template. - React TUI assistant messages now render structured Markdown blocks, including headings, lists, code fences, blockquotes, links, and tables. - Built-in `codex` output style for compact, low-noise transcript rendering in React TUI. ### Fixed - `todo_write` tool now updates an existing unchecked item in-place when `checked=True` instead of appending a duplicate `[x]` line. - Built-in `Explore` and `claude-code-guide` agents no longer hard-code `model="haiku"`, which caused them to fail for users on non-Anthropic providers (OpenAI, Bedrock, custom base URLs, etc.). Both agents now use `model="inherit"` so they run with whatever model the parent session is using. `build_inherited_cli_flags` is also fixed to skip the `--model` flag entirely when the value is `"inherit"`, letting the subprocess correctly inherit the parent model via the `OPENHARNESS_MODEL` environment variable instead of receiving the literal string `"inherit"` as a model name. - React TUI spinner now stays visible throughout the entire agent turn: `assistant_complete` no longer resets `busy` state prematurely, and `tool_started` explicitly sets `busy=true` so the status bar remains active even when tool calls follow an assistant message. `line_complete` is the sole signal that ends the turn and clears the spinner. - Skill loader now uses `yaml.safe_load` to parse SKILL.md frontmatter, correctly handling YAML block scalars (`>`, `|`), quoted values, and other standard YAML constructs instead of naive line-by-line splitting. - `BackendHostConfig` was missing the `cwd` field, causing `AttributeError: 'BackendHostConfig' object has no attribute 'cwd'` on startup when `oh` was run after the runtime refactor that added `cwd` support to `build_runtime`. - Shell-escape `$ARGUMENTS` substitution in command hooks to prevent shell injection from payload values containing metacharacters like `$(...)` or backticks. - Swarm `_READ_ONLY_TOOLS` now uses actual registered tool names (snake_case) instead of PascalCase, fixing read-only auto-approval in `handle_permission_request`. - Memory scanner now parses YAML frontmatter (`name`, `description`, `type`) instead of returning raw `---` as description. - Memory search matches against body content in addition to metadata, with metadata weighted higher for relevance. - Memory search tokenizer handles Han characters for multilingual queries. - Fixed duplicate response in React TUI caused by double Enter key submission in the input handler. - Fixed concurrent permission modals overwriting each other in TUI default mode when the LLM returns multiple tool calls in one response; `_ask_permission` now serialises callers via an `asyncio.Lock` so each modal is shown and resolved before the next one is emitted. - Fixed React TUI Markdown tables to size columns from rendered cell text so inline formatting like code spans and bold text no longer breaks alignment. - Fixed grep tool crashing with `ValueError` / `LimitOverrunError` when ripgrep outputs a line longer than 64 KB (e.g. minified assets or lock files). The asyncio subprocess stream limit is now 8 MB and oversized lines are skipped rather than terminating the session. - Fixed React TUI exit leaving the shell prompt concatenated with the last TUI line. The terminal cleanup handler now writes a trailing newline (`\n`) alongside the cursor-show escape sequence so the shell prompt always starts on a fresh line. - Reduced React TUI redraw pressure when `output_style=codex` by avoiding token-level assistant buffer flushes during streaming. ### Changed - React TUI now groups consecutive `tool` + `tool_result` transcript rows into a single compound row: success shows the result line count inline (e.g. `→ 24L`), errors show a red icon and up to 5 lines of error detail beneath the tool row. Standalone successful tool results are suppressed to reduce transcript noise; standalone errors are still surfaced. - README now links to contribution docs, changelog, showcase material, and provider compatibility guidance. - README quick start now includes a one-command demo and clearer provider compatibility notes. - README provider compatibility section updated to include OpenAI-format providers. ## [0.1.7] - 2026-04-18 ### Fixed - Install script now links `oh`, `ohmo`, and `openharness` into `~/.local/bin` instead of prepending the virtualenv `bin` directory to `PATH`, which avoids overriding Conda-managed shells while preserving global command discovery. - React TUI prompt now supports `Shift+Enter` for inserting a newline without submitting the current prompt. - React TUI busy-state animation is less error-prone on Windows terminals: the extra pseudo-animation line was removed, Windows now uses conservative ASCII spinner frames, and the spinner interval was slightly slowed to reduce flashing. ## [0.1.0] - 2026-04-01 ### Added - Initial public release of OpenHarness. - Core agent loop, tool registry, permission system, hooks, skills, plugins, MCP support, and terminal UI.