Close API clients when the runtime shuts down to release HTTP connection pool resources, and surface the active session ID in /session output.
Cherry-picked from PR #273. Excluded the embedded-wrapper session resolver and memory parser API changes because they need a narrower public API design.
* feat(memory): add structured schema and usage index
Add schema-v1 frontmatter for memory files, including stable ids, deterministic signatures, soft delete metadata, TTL handling, and migration support for legacy stores.
Track recalled memories in usage_index.json so retrieval can prioritize useful memories and auto-dream can review stale unused entries before pruning.
Keep project and ohmo memory backends aligned under the same behavior while preserving runtime compatibility for unmigrated Markdown files.
* fix(memory): make backend migration defaults explicit
Add /model list/add/remove/clear so a single provider profile can expose multiple switchable models in the TUI selector. Also add regression coverage for invalid grep regexes in the Python fallback.\n\nFixes #222\nRefs #218
Three related bugs in the React TUI slash-command flow (fixes#183):
1. Tab completion left a trailing space after the command, so hitting
Enter right after Tab would submit "/exit " (with arg) instead of
running /exit. Drop the space — user can add one themselves if they
want to type an argument.
2. After a programmatic setInput() from completion/history, the
MultilineTextInput cursor stayed at its previous offset instead of
moving to the end of the newly-inserted text. Subsequent keystrokes
landed in the middle of the completed command ("/eXxit" when typing
X after Tab-completing "/exit"). Track the last internally-authored
value via a ref; when the incoming value differs, treat it as an
external change and snap the cursor to the end.
3. /quit is the other obvious word for "exit" and users were surprised
when it wasn't registered. Add an `aliases` field to SlashCommand
and make /quit an alias of /exit. help/list output deduplicates
aliases so they resolve via lookup without cluttering the command
listing.
Tests:
- tests/test_commands/test_registry.py: new tests for the alias path
and for help/list dedup. Both pass locally.
- MultilineTextInput doesn't have a standalone unit test for the
cursor behavior (uses node:test + ink render harness, can't run
without node toolchain on this machine), but the fix is a local,
obvious change in a single component.
Co-authored-by: Yufeng He <40085740+universeplayer@users.noreply.github.com>
- Update prompt assertions to match new OpenHarness system prompt
- Update agent definition tests (verification not verifier, tools=['*'])
- Add pytest.mark.skipif for tests needing real API or AutoAgent workspace
- Fix agent tool test for InProcessBackend same-name spawn conflict
- Fix flaky worktree test for CI environments
A lightweight open-source Python implementation of the Agent Harness architecture.
44x lighter than Claude Code (11K vs 512K lines), 98% core tool coverage.
- 43 tools with Pydantic validation and parallel execution
- Skills system compatible with anthropics/skills (17+ tested)
- Plugin system compatible with claude-code/plugins (12+ tested)
- API retry with exponential backoff
- Multi-level permissions with path rules
- React/Ink TUI with "Oh my Harness!" branding
- 114 unit tests + 6 E2E test suites
- MIT License