文件历史

提交图

42 次代码提交

作者 SHA1 备注 提交日期
tjb-tech 889d9dcbda fix(grep): keep missing roots as tool errors 2026-05-16 12:24:21 +00:00
tjb-tech a2888506ba fix(web): support explicit search endpoint and proxy 2026-05-16 12:16:15 +00:00
yl-jiang f61f70d7b1 feat(tui): preview diffs before edit and write approval
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-13 13:44:43 +08:00
Jiabin Tang 1929ad8051 feat(ohmo): add agent-turn cron delivery (#247) 2026-05-10 16:55:10 +08:00
Jiabin Tang 0c6b81d61f feat: add configurable image generation tool (#244)
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.
2026-05-09 13:18:23 +08:00
tjb-tech 0e557a65d3 feat(skills): expose user-invocable skills as slash commands 2026-05-06 13:43:39 +00:00
Mcy0618 d611d6ddf6 feat(vision): add image-to-text fallback for text-only models (#227)
* feat(provider): add ModelScope inference API support

* fix(cli/auth): wire ModelScope into CLI and auth manager

* feat(vision): add image-to-text fallback for non-multimodal models

* fix: remove leftover merge conflict marker in query.py

* test: fix cross-platform test failures

* test: remove unused os import in test_environment.py
2026-05-03 16:47:56 +08:00
tjb-tech 47e0e93387 fix(gateway): degrade image attachments for text-only models
Support absolute glob patterns without crashing and retry ohmo channel messages without ImageBlocks when a provider rejects image input.\n\nFixes #225\nFixes #226
2026-05-02 14:04:25 +00:00
tjb-tech c835d7cf2e feat(model): manage profile model allowlists
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
2026-05-01 12:38:48 +00:00
yl-jiang 0305dfb3ec fix(tools): subprocess stderr 改为 DEVNULL 并为 bash_tool 添加读取超时
glob/grep 工具的 rg 子进程 stderr 由 PIPE 改为 DEVNULL,
防止 stderr buffer 写满时子进程阻塞造成管道死锁;
bash_tool 的 _read_remaining_output 加 2s 超时,
避免进程退出后读取残余输出时无限挂起

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-27 22:57:31 +08:00
tjb-tech b11a83df66 test(ci): stabilize full-suite regressions 2026-04-19 15:07:24 +00:00
tjb-tech d4eae153d3 fix(shell): address Windows backspace and TUI shell regressions 2026-04-19 14:22:37 +00:00
yu de9f9c05ca fix(agent): honor spawn overrides and harden task cleanup (#148) 2026-04-16 14:33:46 +08:00
tjb-tech 0c84d85630 fix(bash): surface clearer install workflow guidance 2026-04-14 08:59:09 +00:00
yulin f8e83c8409 fix(tools): update todo items in place instead of duplicating (#135)
* fix(tools): todo_write updates existing items in-place instead of duplicating

When an agent marks a todo item done by calling todo_write with
checked=True, the tool previously always appended a new [x] line,
leaving the original [ ] line intact. This produced duplicate entries.

The tool now performs an upsert:
- If the item exists as [ ], replace it with [x] in-place.
- If it is already in the target state, return a no-op result.
- Otherwise, append as before.

Adds test_todo_write_upsert to cover the new behaviour.

Co-authored-by: Copilot

* fix(tools): simplify todo_write tool description for LLM clarity

Co-authored-by: Copilot

---------

Co-authored-by: JiangYulin <yulin@JiangYulindeMacBook-Pro.local>
2026-04-14 00:04:24 +08:00
tjb-tech 7f25a84d8e fix(ci): remove flaky fake subprocess cleanup assertion 2026-04-13 06:13:24 +00:00
tjb-tech 71c62c46a9 fix(ci): relax fake subprocess timeout assertions 2026-04-13 06:11:49 +00:00
tjb-tech cdb7256e6b fix(ci): make bash timeout tests robust across runners 2026-04-13 06:10:21 +00:00
tjb-tech 7f22107170 fix(ci): normalize bash timeout output under pty 2026-04-13 05:48:58 +00:00
tjb-tech 9f97283320 fix(bash): surface partial output for interactive timeouts 2026-04-13 05:34:05 +00:00
tjb-tech bd4df81f63 Merge pull request #92 from 13ernkastel/codex/harden-path-rules-and-web-guards 2026-04-11 13:49:52 +00:00
tjb-tech 7a29e66fdb fix(grep): handle long rg lines without crashing 2026-04-11 09:11:21 +00:00
tjb-tech 76d91fdfa1 fix(swarm): run subprocess teammates in headless worker mode 2026-04-10 09:50:07 +00:00
tjb-tech 27abeae3eb Merge #88 and fix agent team creation 2026-04-10 03:59:44 +00:00
13ernkastel 64c0380805 Stabilize web tool tests across full suite 2026-04-09 23:06:27 +08:00
13ernkastel 04556430b7 Fix web tool test monkeypatching 2026-04-09 23:02:20 +08:00
13ernkastel 2931bc0f96 harden path rules and web network guards 2026-04-09 22:49:23 +08:00
tjb-tech a890f4eef5 fix(ci): restore runtime helper import 2026-04-09 12:35:52 +00:00
tjb-tech 6fbc61fc13 fix(ohmo): support channel slash commands and stabilize tests 2026-04-09 12:31:40 +00:00
tjb-tech 5552cce5c3 Merge branch 'pr-63' 2026-04-08 12:57:35 +00:00
tjb-tech 86a067cb01 fix(swarm): make subprocess agents pollable in real runs 2026-04-08 12:16:45 +00:00
tjb-tech f5d7d0f2f9 Merge branch 'pr-60' 2026-04-08 12:16:31 +00:00
tjb-tech 2f6f8b01d6 release: ship 0.1.4 fixes and ohmo updates 2026-04-08 09:53:39 +00:00
siaochuan 6510a820a7 fix(mcp): use JSON Schema types in tool input models; exclude None from MCP calls
When non-Anthropic models (MiniMax, Moonshot, etc.) call MCP tools, they
sometimes send `null` for parameters they consider optional. The previous
implementation typed all fields as `object | None`, so:

1. Pydantic accepted `null` even for required fields (e.g. `query`)
2. `model_dump()` serialized these as `{"query": null, ...}`
3. The MCP server received null for required parameters → validation error

Fix:
- Map JSON Schema types to proper Python types (string→str, integer→int,
  etc.) so Pydantic rejects null for required fields
- Use `exclude_none=True` in model_dump to strip optional null parameters
  before passing to the MCP server

This affects ALL MCP tool servers, not just specific ones.

Tested with: MiniMax-M2.7-highspeed + dongtian MCP server (15 tools).
2026-04-08 11:13:09 +08:00
Jiri Puc 90b68b98fe test(agent-tool): add regression tests for subprocess backend fix (#60)
Two tests covering the fix from PR #60:

1. test_agent_tool_uses_subprocess_backend_and_task_is_pollable
   - Spawns an agent via AgentTool
   - Asserts backend=subprocess in the output (not in_process)
   - Asserts the returned task_id has no "in_process_" prefix
   - Asserts get_task_manager().get_task(task_id) finds the record,
     proving that task tools (TaskGet, TaskOutput, etc.) would succeed

2. test_send_message_swarm_path_uses_subprocess_backend
   - Patches SubprocessBackend.send_message as an AsyncMock
   - Calls SendMessageTool with a name@team task_id
   - Asserts the mock was called (i.e. SubprocessBackend was used,
     not InProcessBackend)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 17:19:48 +02:00
tjb-tech d93c795568 fix(web_fetch): harden URL validation, improve HTML parser, and add untrusted-content banner
- Validate URL scheme (http/https only), reject embedded credentials
- Replace regex-based HTML-to-text with HTMLParser to avoid pathological
  backtracking on large pages (fixes Issue #45 timeout concern)
- Add '[External content]' banner to fetched output for prompt-injection defense
- Tighten User-Agent string and cap max redirects to 5
- Add tests: large-HTML performance, embedded-credentials rejection, banner presence
2026-04-07 11:45:42 +00:00
tjb-tech 68e7922469 fix(eval): handle file-target grep and refresh real e2e scripts 2026-04-05 12:58:51 +00:00
Chao Qin a6dfa8f56d feat: wire --resume/--continue CLI flags and add cron scheduler daemon (#16)
Cherry-picked from PR #16 by win4r, excluding auto-compact (already
implemented in a more thorough version based on Claude Code source).

Resume/Continue:
- Wire --continue (most recent session) and --resume (picker/ID) CLI flags
- Pass restore_messages through app.py → backend_host.py → runtime.py
- Uses existing session_storage infrastructure

Cron scheduler daemon:
- oh cron start/stop/status/list/toggle/history subcommands
- Background daemon with 30s tick, concurrent job execution, PID file
- Job state: enabled, last_run, next_run, last_status, created_at
- JSONL execution history at ~/.openharness/data/cron_history.jsonl
- croniter-based expression validation and next-run computation

Cost/usage output in print mode:
- Token usage summary (input/output/total) printed to stderr
- Tool activity indicators during execution

New files: cron_scheduler.py, cron_toggle_tool.py, test_cron.py, test_cron_scheduler.py
Modified: cli.py, runtime.py, app.py, backend_host.py, cron.py, tools/__init__.py
2026-04-04 10:29:09 +00:00
tjb-tech bd976f4671 fix(ci): skip worktree test in CI, mark flaky test as xfail 2026-04-04 10:17:00 +00:00
tjb-tech 8abe47603e fix(ci): update tests for new system prompt, agent definitions, and CI compatibility
- 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
2026-04-04 10:14:22 +00:00
tjb-tech aab665492f docs: add repo docs and CI scaffolding 2026-04-03 04:58:40 +00:00
tjb-tech 5dd8b952ec Initial release: oh — OpenHarness: Open Agent Harness v0.1.0
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
2026-04-01 16:32:25 +00:00