Remove the hard-coded nanobot name from Telegram /start and /help responses and sanitize dangling tool-use turns before continue_pending resumes a session.
Add a configurable image_generation tool with OpenAI-compatible and Codex hosted providers, propagate generated media metadata through stream events, and let ohmo channels send generated image/file paths automatically.
Extends the HookEvent enum with three new events so plugins authored
against Claude Code's hook protocol can run unmodified on OpenHarness.
- user_prompt_submit fires in QueryEngine.submit_message before the
model sees a new user message. Payload: {event, prompt}.
- stop fires inside run_query when the assistant turn ends without
tool uses. Payload: {event, stop_reason}.
- notification fires before the permission_prompt callback on
confirmation-required tool calls. Payload: {event, notification_type,
tool_name, reason}.
Hook return values are observational in this release; exit-code-driven
blocking and continuation semantics are deferred to a follow-up so the
surface area of this change stays small and reviewable.
Tests in tests/test_engine/test_query_engine.py cover each fire site,
including a negative case verifying stop does not fire on turns that
contain tool uses.
`asyncio.gather` was called without `return_exceptions=True`, so a single
escaping exception from one parallel tool propagated out of the gather,
abandoned its sibling coroutines, and left the assistant turn with one or
more `tool_use` blocks that never received a matching `tool_result`. The
Anthropic Messages API rejects the next request on the session with a 400
in that state, so any unhandled tool exception during a multi-tool turn
effectively bricks the session.
Pass `return_exceptions=True` and synthesize an `is_error=True`
`ToolResultBlock` for each raised exception, matched to the originating
`tool_use_id`. The exception is logged via `log.exception` so the failure
is still observable.
Co-authored-by: José Maia <glitch-ux@users.noreply.github.com>
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