python-agent-harness 1.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. python_agent_harness/__init__.py +20 -0
  2. python_agent_harness/__main__.py +5 -0
  3. python_agent_harness/agent.py +703 -0
  4. python_agent_harness/cli.py +273 -0
  5. python_agent_harness/client.py +832 -0
  6. python_agent_harness/commands.py +181 -0
  7. python_agent_harness/config.py +464 -0
  8. python_agent_harness/context_manager.py +100 -0
  9. python_agent_harness/diffrender.py +84 -0
  10. python_agent_harness/mcp/__init__.py +21 -0
  11. python_agent_harness/mcp/client.py +161 -0
  12. python_agent_harness/mcp/config.py +130 -0
  13. python_agent_harness/mcp/manager.py +290 -0
  14. python_agent_harness/models.py +149 -0
  15. python_agent_harness/persistence.py +297 -0
  16. python_agent_harness/planmode.py +112 -0
  17. python_agent_harness/prompts/agent.md +362 -0
  18. python_agent_harness/prompts/build-switch.md +5 -0
  19. python_agent_harness/prompts/commands/explain.md +13 -0
  20. python_agent_harness/prompts/compact.md +33 -0
  21. python_agent_harness/prompts/initialize.md +66 -0
  22. python_agent_harness/prompts/plan-mode.md +70 -0
  23. python_agent_harness/prompts/plan.md +26 -0
  24. python_agent_harness/prompts/review.md +100 -0
  25. python_agent_harness/prompts/subagent.md +208 -0
  26. python_agent_harness/prompts/summary.md +11 -0
  27. python_agent_harness/prompts/task-completion-rules.md +50 -0
  28. python_agent_harness/prompts/title.md +44 -0
  29. python_agent_harness/prompts.py +498 -0
  30. python_agent_harness/session.py +781 -0
  31. python_agent_harness/subagent.py +61 -0
  32. python_agent_harness/token_estimator.py +125 -0
  33. python_agent_harness/tool_runner.py +247 -0
  34. python_agent_harness/tools/__init__.py +56 -0
  35. python_agent_harness/tools/agent_tool.py +75 -0
  36. python_agent_harness/tools/base.py +147 -0
  37. python_agent_harness/tools/bash.py +298 -0
  38. python_agent_harness/tools/edit.py +272 -0
  39. python_agent_harness/tools/filesystem.py +180 -0
  40. python_agent_harness/tools/glob.py +161 -0
  41. python_agent_harness/tools/grep.py +149 -0
  42. python_agent_harness/tools/insert.py +61 -0
  43. python_agent_harness/tools/mcp.py +203 -0
  44. python_agent_harness/tools/mkdir.py +30 -0
  45. python_agent_harness/tools/planexit.py +45 -0
  46. python_agent_harness/tools/question.py +70 -0
  47. python_agent_harness/tools/read.py +104 -0
  48. python_agent_harness/tools/skill.py +32 -0
  49. python_agent_harness/tools/todo.py +60 -0
  50. python_agent_harness/tools/write.py +56 -0
  51. python_agent_harness/tui/__init__.py +68 -0
  52. python_agent_harness/tui/commands.py +652 -0
  53. python_agent_harness/tui/core.py +385 -0
  54. python_agent_harness/tui/input.py +412 -0
  55. python_agent_harness/tui/render.py +535 -0
  56. python_agent_harness-1.5.0.dist-info/METADATA +251 -0
  57. python_agent_harness-1.5.0.dist-info/RECORD +61 -0
  58. python_agent_harness-1.5.0.dist-info/WHEEL +5 -0
  59. python_agent_harness-1.5.0.dist-info/entry_points.txt +2 -0
  60. python_agent_harness-1.5.0.dist-info/licenses/LICENSE +21 -0
  61. python_agent_harness-1.5.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,251 @@
1
+ Metadata-Version: 2.4
2
+ Name: python-agent-harness
3
+ Version: 1.5.0
4
+ Summary: Python agent execution harness: agent loop, tools, plan/build modes, sessions
5
+ Requires-Python: >=3.11
6
+ Description-Content-Type: text/markdown
7
+ License-File: LICENSE
8
+ Requires-Dist: rich>=13.0
9
+ Requires-Dist: httpx>=0.27
10
+ Requires-Dist: prompt_toolkit>=3.0
11
+ Provides-Extra: mcp
12
+ Requires-Dist: mcp<3,>=2.0; extra == "mcp"
13
+ Provides-Extra: dev
14
+ Requires-Dist: ruff>=0.6; extra == "dev"
15
+ Requires-Dist: pyright>=1.1.380; extra == "dev"
16
+ Requires-Dist: build>=1.2; extra == "dev"
17
+ Requires-Dist: coverage[toml]>=7.0; extra == "dev"
18
+ Requires-Dist: pip-audit>=2.7; extra == "dev"
19
+ Requires-Dist: mcp<3,>=2.0; extra == "dev"
20
+ Dynamic: license-file
21
+
22
+ <div align="center">
23
+
24
+ # python-agent-harness
25
+
26
+ **A lightweight Python coding-agent harness for reliable autonomous coding.**
27
+ FSM-driven execution · OpenAI-compatible · built for daily use and easy customization
28
+
29
+ [![CI](https://github.com/beacoder/python-agent-harness/actions/workflows/ci.yml/badge.svg)](https://github.com/beacoder/python-agent-harness/actions/workflows/ci.yml)
30
+ [![Python](https://img.shields.io/badge/python-3.11%2B-blue)](https://www.python.org/downloads/)
31
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
32
+
33
+ </div>
34
+
35
+ A terminal coding agent that reads your codebase, plans changes, edits files, runs commands, and verifies its work.
36
+
37
+ `python-agent-harness` is inspired by [gptel-agent-harness](https://github.com/beacoder/gptel-agent-harness) and [opencode](https://github.com/anomalyco/opencode). It brings opencode's prompts and core behaviors—such as `AGENTS.md` discovery, plan/build modes, skills, sub-agents, and todo tracking—into a lightweight Python implementation with only **three runtime dependencies**:
38
+
39
+ - `rich`
40
+ - `httpx`
41
+ - `prompt_toolkit`
42
+
43
+ It works with any **OpenAI-compatible API** and is designed to be easy to inspect, customize, and use for everyday software development.
44
+
45
+ ## Demo
46
+
47
+ ![python-agent-harness demo](demo.png)
48
+
49
+ ## Quick start
50
+
51
+ ```sh
52
+ git clone git@github.com:beacoder/python-agent-harness.git
53
+ cd python-agent-harness
54
+
55
+ make install
56
+ . venv/bin/activate
57
+
58
+ python-agent-harness config --init
59
+ python-agent-harness run
60
+ ```
61
+
62
+ Edit `~/.config/python-agent-harness/config.json` and set your `base_url`, `api_key`, and `model`.
63
+
64
+ Optional extras:
65
+
66
+ ```sh
67
+ pip install -e ".[mcp]" # MCP server integration
68
+ pip install -e ".[dev]" # development tools
69
+ ```
70
+
71
+ ## Features
72
+
73
+ - **FSM-driven execution** — explicit `WAIT` / `TOOL` / `TRET` / `SUPERVISE` / `DONE` / `ERRS` / `ABRT` states. Completion supervision nudges the model when it stops early, while failed tool calls are sanitized so they never strand the agent. Transient API failures (`429` / `5xx`) retry with exponential backoff and jitter.
74
+ - **Context management** — CJK-aware token estimation, per-model context windows, and automatic compaction at 70% usage.
75
+ - **Coding tools** — `Agent`, `TodoWrite`, `Glob`, `Grep`, `Read`, `Insert`, `Edit` (including unified diffs), `Write`, `Mkdir`, `Bash`, `Skill`, `Question`, and `PlanExit`. Synchronous tools execute sequentially; asynchronous tools such as `Bash` and `Agent` can run concurrently while preserving emitted order.
76
+ - **Plan / Build modes** — plan mode is read-only except for the per-session plan file.
77
+ - **Persistent sessions** — sessions are automatically saved after every response to `~/.local/share/python-agent-harness/sessions/`, with LLM-generated titles and support for `/restore --latest` and `/sessions`.
78
+ - **Focused TUI** — a Rich-based interface with a pinned status bar, Todos panel, inline red/green diff rendering for `Edit` and `Write`, and a `prompt_toolkit` editor with history and completion. `Esc+Enter` submits, `Ctrl-D` quits, and `Ctrl-C` cancels without leaving the application.
79
+ - **MCP support** — optional MCP integration through the `[mcp]` extra. MCP tools become ordinary agent tools such as `mcp__<server>__<tool>`. Supports `stdio`, `streamable-http`, and `sse` transports.
80
+ - **Slash commands** — built-in `/init`, `/review`, `/explain`, and other commands, plus custom commands loaded from `prompts/commands/*.md`.
81
+
82
+ ## Inspired by opencode
83
+
84
+ Most of [opencode](https://github.com/anomalyco/opencode)'s prompts and core behaviors have been ported to this project. The goal is to retain its practical coding-agent workflow while keeping the implementation small, dependency-light, and easy to customize.
85
+
86
+ ### Prompt and behavior mapping
87
+
88
+ The following opencode prompts have corresponding implementations in `python-agent-harness`:
89
+
90
+ | opencode | python-agent-harness |
91
+ |---|---|
92
+ | `default.txt` (main agent) | `agent.md` |
93
+ | `plan.txt` / `plan-mode.txt` / `build-switch.txt` | `plan.md` / `plan-mode.md` / `build-switch.md` |
94
+ | `task.txt` (sub-agent) | `subagent.md` + `Agent` tool |
95
+ | `todowrite.txt` / `question.txt` / `skill.txt` | `TodoWrite` / `Question` / `Skill` tools |
96
+ | `read.txt` / `write.txt` / `edit.txt` / `grep.txt` / `glob.txt` | `Read` / `Write` / `Edit` / `Grep` / `Glob` tools |
97
+ | `shell.txt` | `Bash` tool + `agent.md` Git/GitHub guidance |
98
+ | `plan-enter.txt` / `plan-exit.txt` | `PlanExit` tool |
99
+ | `initialize.txt` / `review.txt` / `explain` | `initialize.md` / `review.md` / `commands/explain.md` |
100
+ | compaction / summary / title | `compact.md` / `summary.md` / `title.md` |
101
+ | `AGENTS.md` handling | `prompts.py` (`find_agents_md_files`, `load_context_files`, per-file resolution) |
102
+
103
+ ## Configuration
104
+
105
+ All LLM settings live in a single JSON configuration file. Environment variables are optional.
106
+
107
+ ```json
108
+ {
109
+ "llm": {
110
+ "base_url": "https://api.openai.com/v1",
111
+ "api_key": "sk-...",
112
+ "model": "gpt-5-mini",
113
+ "reasoning_effort": null,
114
+ "stream": true
115
+ },
116
+ "models": {
117
+ "_comment": "Named LLM profiles for /model switching. Partial settings; unset keys inherit the main llm.",
118
+ "deepseek": {
119
+ "base_url": "https://api.deepseek.com/v1",
120
+ "model": "deepseek-chat"
121
+ },
122
+ "qwen": {
123
+ "base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
124
+ "model": "qwen3.5-coder"
125
+ }
126
+ },
127
+ "subagent_llm": {
128
+ "profile": null,
129
+ "base_url": null,
130
+ "api_key": null,
131
+ "model": null,
132
+ "temperature": null,
133
+ "max_tokens": null,
134
+ "timeout": null,
135
+ "reasoning_effort": null,
136
+ "stream": null
137
+ },
138
+ "paths": {
139
+ "context_path": null,
140
+ "skill_path": null
141
+ },
142
+ "mcp": {
143
+ "servers": {
144
+ "example": {
145
+ "transport": "stdio",
146
+ "command": "npx",
147
+ "args": [
148
+ "-y",
149
+ "@modelcontextprotocol/server-filesystem",
150
+ "/tmp"
151
+ ],
152
+ "env": [],
153
+ "parallel": false,
154
+ "timeout": null,
155
+ "enabled": false
156
+ }
157
+ }
158
+ }
159
+ }
160
+ ```
161
+
162
+ ### Configuration options
163
+
164
+ - **`llm`** — main LLM configuration. Optional keys include `backend`, `temperature`, `max_tokens`, `timeout`, `reasoning_effort`, and `stream`. Values such as `reasoning_effort` are passed to the API as-is when set. `run --no-stream` overrides `stream`.
165
+ - **`models`** — named LLM profiles for runtime switching with `/model`. A profile is a partial settings dictionary; unset keys inherit from the main `llm`. `default` restores the main LLM configuration.
166
+ - **`subagent_llm`** — LLM configuration for `Agent` tool requests. Unset values inherit from the main `llm`. Set `profile` to reuse a profile from `models`. Precedence is: profile settings > explicit `subagent_llm` settings > main `llm` > environment variables.
167
+ - **`paths.context_path` / `paths.skill_path`** — locations from which to load context files and skills. When unset, the project-local `<project>/contexts` and `<project>/skills` directories are used.
168
+ - **`mcp.servers`** — MCP server configuration. Requires the `[mcp]` extra. Each server supports `transport`, `command`, `args`, `env`, `url`, `headers`, `parallel`, `timeout`, and `enabled`.
169
+ - **Configuration precedence** — code defaults < config file < `OPENAI_*` environment variables. Sub-agent settings also support `OPENAI_SUBAGENT_*` (`_BASE_URL`, `_API_KEY`, `_MODEL`, `_BACKEND`).
170
+ - **Custom config** — use `--config PATH` or `PYTHON_AGENT_HARNESS_CONFIG`.
171
+ - **LLM logging** — request and response bodies are logged as JSON to `/tmp/python-agent-harness-<date>-<id>.json`. Set `LLM_LOG_DIR` to change the directory. The log path is printed at startup.
172
+
173
+ ## Usage
174
+
175
+ ```sh
176
+ python-agent-harness run [project-dir]
177
+ ```
178
+
179
+ Launches the interactive TUI agent. If `project-dir` is omitted, the current directory is used.
180
+
181
+ ### Slash commands
182
+
183
+ | Command | Description |
184
+ |---|---|
185
+ | `/plan` / `/build` | Switch between read-only plan mode and build mode |
186
+ | `/init` | Create or update `AGENTS.md` |
187
+ | `/review` | Review uncommitted changes, commits, branches, or pull requests |
188
+ | `/explain [project] [target]` | Explain code |
189
+ | `/compact` | Compact the conversation |
190
+ | `/summary` | Append a conversation summary |
191
+ | `/save` | Save the current session |
192
+ | `/sessions` | List saved sessions |
193
+ | `/restore [path\|title\|--latest\|latest]` | Restore a session; title matching uses substring search |
194
+ | `/clear` | Start a fresh conversation |
195
+ | `/model [name]` | Switch LLM profiles; `default` restores the session's original model |
196
+ | `/exit` | Quit |
197
+
198
+ Custom commands from `prompts/commands/*.md` are registered as slash commands as well (TUI only).
199
+
200
+ ## Project layout
201
+
202
+ ```text
203
+ python_agent_harness/
204
+ ├── agent.py # Agent FSM core: states, transitions, supervision
205
+ ├── tool_runner.py # Tool-call execution/delivery + history salvage
206
+ ├── context_manager.py # Context-ratio tracking + compaction
207
+ ├── client.py # OpenAI-compatible streaming client (httpx)
208
+ ├── models.py # Message / ToolCall / ToolSpec data classes
209
+ ├── token_estimator.py # CJK-aware token estimation + calibration
210
+ ├── planmode.py # Plan/build modes + plan-file lifecycle
211
+ ├── prompts.py # Prompt loading + system-prompt assembly
212
+ ├── persistence.py # Session persistence + titles
213
+ ├── session.py # Session wiring hub + MCP lifecycle
214
+ ├── subagent.py # Sub-agent runner + error containment
215
+ ├── commands.py # Init/review/custom command definitions
216
+ ├── cli.py # CLI entry points
217
+ ├── tui/ # Rich + prompt_toolkit TUI (package)
218
+ ├── diffrender.py # Unified diff generation + Rich rendering
219
+ ├── mcp/ # Optional MCP client
220
+ └── tools/ # Tool implementations + registry
221
+ ```
222
+
223
+ ## Development
224
+
225
+ Requires Python ≥ 3.11. CI runs against Python 3.11, 3.12, and 3.13.
226
+
227
+ ```sh
228
+ make test # unit tests
229
+ venv/bin/pip install -e ".[dev]" # development tools
230
+ venv/bin/ruff check . # lint
231
+ venv/bin/pyright # type checking
232
+ venv/bin/python -m build # build sdist + wheel
233
+ venv/bin/pip-audit # dependency audit
234
+ ```
235
+
236
+ CI blocks on Ruff and Pyright failures.
237
+
238
+ ## Design philosophy
239
+
240
+ **Keep it intact, not bloated.**
241
+
242
+ The project aims to provide a capable coding-agent within a lightweight framework.
243
+
244
+ ## Related projects
245
+
246
+ - [gptel-agent-harness](https://github.com/beacoder/gptel-agent-harness) — the Emacs-based implementation that inspired this project.
247
+ - [opencode](https://github.com/anomalyco/opencode) — the primary source of many prompts and coding-agent behaviors.
248
+
249
+ ## License
250
+
251
+ MIT
@@ -0,0 +1,61 @@
1
+ python_agent_harness/__init__.py,sha256=hC8AyhcWRemBxbFb9gGCBwwBc45PoR4FtfGk20qhw2o,440
2
+ python_agent_harness/__main__.py,sha256=E6Gls0DNz8GQK2K-kOUIx8cYhgANW_CH54VKrfCfs14,52
3
+ python_agent_harness/agent.py,sha256=TuWc5wfK3JgqUXeSVPHw8fsbo1WRfDbQsry8nBMWDqw,30533
4
+ python_agent_harness/cli.py,sha256=mp-cvQh0DVkO-dgEMERkOoLkjkoABWXWykFm_HaTx2g,11120
5
+ python_agent_harness/client.py,sha256=anwHo23zzINLfb9r0WEW8ZDwYMBe48sbEOq3ZRVv1o0,34907
6
+ python_agent_harness/commands.py,sha256=g1fYoybaWlyCH-7n3htgxY6xtMwHP7m7-G0br4Kjkdk,5721
7
+ python_agent_harness/config.py,sha256=BrfZxZKW-WMyj_-_wqaW4LNfAI7vPdZ272lMfyYWQio,17709
8
+ python_agent_harness/context_manager.py,sha256=FyjkIXd7idKQ_yU6neDcsEIRAz_v2ECrcyvxPBgt5iw,4157
9
+ python_agent_harness/diffrender.py,sha256=k7pJzJtn2eT7BZI6i83moVzPKrRXp8Q6XVmF8zJZLRo,2946
10
+ python_agent_harness/models.py,sha256=NZPFdTaAmAN3HjZQnzZ1sqTvzDVhvl-qahYDxz-64TA,5115
11
+ python_agent_harness/persistence.py,sha256=yHUJqy9mWmlzF_efhRosuBuAJNng2lR7Laz2zQuoUqw,10843
12
+ python_agent_harness/planmode.py,sha256=9wrSEg5YtS9II-SOL08XTOEFSiKtdF0fS05JlXxLqM4,3909
13
+ python_agent_harness/prompts.py,sha256=3kZZwQ1tUQ7NiRLryxrOQqgBPaskNPIfKdIMCDjg_N8,18445
14
+ python_agent_harness/session.py,sha256=CFIzws6Upvdw8gHT93a-C5TGh8rFQYtyTugpWjYiT60,34915
15
+ python_agent_harness/subagent.py,sha256=ptiETpsjgVyXybSr9yTHsNHrIx8gy_awrMOWepBwxj4,2292
16
+ python_agent_harness/token_estimator.py,sha256=VRmBrFK9906nmpaLPTqtggZbCGx6AhE_VJpFba9uc5U,4555
17
+ python_agent_harness/tool_runner.py,sha256=f18-g7UKEe_pjdgI3fnhkxj-RnkTeoPiXo0SJpft91Y,10487
18
+ python_agent_harness/mcp/__init__.py,sha256=dlgZRr_pljESu-aJfo3aq_fLDkZN7quwrPUR112Kohw,535
19
+ python_agent_harness/mcp/client.py,sha256=Z738VBsD_-I8bMD24TTEGoWglVkwAtBl6lFDPeNsx1Y,6234
20
+ python_agent_harness/mcp/config.py,sha256=XpeB0AzWTCI6BoDqScsKzjBt5BPHgaCc58WEJfsvPRM,4894
21
+ python_agent_harness/mcp/manager.py,sha256=0s34NfFmfJdVZmIy39fCGtrWbagYfz1CP6yHYgL3lp0,11570
22
+ python_agent_harness/prompts/agent.md,sha256=sP8ZLVR8F5ut5C-vNWfBQL3mULPWFzQ4I8lgo1gaO5g,21061
23
+ python_agent_harness/prompts/build-switch.md,sha256=Xj22FqaFo9-q-V-4aubirPvfUgvaYPeyf3J9Koi6iiU,233
24
+ python_agent_harness/prompts/compact.md,sha256=hz2yNyp-RteD5fUKqDfyPbM3SOhjEoinRLYSx1htXNo,978
25
+ python_agent_harness/prompts/initialize.md,sha256=kgnEjtFqnKXLg38Jgxgnzhhn7B3bM8ahrRl3kypnkyg,3492
26
+ python_agent_harness/prompts/plan-mode.md,sha256=ExEfFuukjzMQiUEYOccLleOO1S5tJDo-Hdi8IC_blow,4551
27
+ python_agent_harness/prompts/plan.md,sha256=NJWArCzBzXOvJssCrbFfoGdzf0s6k3Qtlz_dO8hjf9Y,1479
28
+ python_agent_harness/prompts/review.md,sha256=LU-Pz9sQsL4xPHsBKvaA9Xe_ApZ4W2nePgaunxcU_HI,4535
29
+ python_agent_harness/prompts/subagent.md,sha256=dJ3RYaW2mwpsu6JM1bftxfUHvc-DDkTRviyVqzjACEs,9874
30
+ python_agent_harness/prompts/summary.md,sha256=MHMU60HMOKkIga6fJuBALO7tBOcQRgFEhqmQitRSAjM,648
31
+ python_agent_harness/prompts/task-completion-rules.md,sha256=VrwpiSL98GCYGuph9f2qVs-tFFfLBUUmmq3w_zJEHrE,1437
32
+ python_agent_harness/prompts/title.md,sha256=56aEjroyjyjH6HCHTPBZHk7br5DXYCrY_f6QYBxuZW8,2120
33
+ python_agent_harness/prompts/commands/explain.md,sha256=RMmP9L3TfPpW0dthlGobWbgqBIc7H2LJIMIJT2JDN3Y,539
34
+ python_agent_harness/tools/__init__.py,sha256=CiJMKQoHKeESYId5JdmUPgkfvW8SPxrgV4isBEtnOqo,1142
35
+ python_agent_harness/tools/agent_tool.py,sha256=NX5EIAOp4gxHkN5fs_ARaRRN0PoWwQVQWwUetRgfBMo,3054
36
+ python_agent_harness/tools/base.py,sha256=tQ61t57yX8Iwjv-VkZdO7HZuUUvS6KJa9fj6TSGDYHg,5321
37
+ python_agent_harness/tools/bash.py,sha256=Sco7uQQ2AMKKKKzho7yAxkO3nVY0NCMYQc7Hts7lCuc,11532
38
+ python_agent_harness/tools/edit.py,sha256=wTTgBYYaOT3U1ffV5tMjP8CLwECUZ6tuUBML6OxRnk8,11320
39
+ python_agent_harness/tools/filesystem.py,sha256=KbQtThQWpXuJ31aiGJJYEgCBOTI923VHP2eugVTex2I,6472
40
+ python_agent_harness/tools/glob.py,sha256=dxWdzc30KmXsOhz3TaA2CgXahyq-whYaurOatFp_hVc,6000
41
+ python_agent_harness/tools/grep.py,sha256=mDpAFQKuIKiLN-CuzlLzdenUVJgQx9xyOYi_WyX-260,5112
42
+ python_agent_harness/tools/insert.py,sha256=AXC1S7pcvD0n3cpw9ALO7hLcCSOiIcaqk4rUVQXQ0-0,2027
43
+ python_agent_harness/tools/mcp.py,sha256=v_XMOfxGpaJ3xw3i4j3HOz03qhMluGfLotLZSQPD_Ac,7489
44
+ python_agent_harness/tools/mkdir.py,sha256=OU5YwCd5soNXXqAKEev93NJHRvDwGKEXcQjgsCIuzAQ,914
45
+ python_agent_harness/tools/planexit.py,sha256=ogmoTBBQ0klNe0ktLiVn6dEU4j3J8CdqS7UwvKMZLxY,1935
46
+ python_agent_harness/tools/question.py,sha256=yTvNkCmT3M1kphh4ZX3-Yis9yQnnj314-AF5Xkp2Fr4,2547
47
+ python_agent_harness/tools/read.py,sha256=Mpl0SEeXGYtu-HV3Za5A9OPuGARAYAfjIjrCyu_s0kk,4278
48
+ python_agent_harness/tools/skill.py,sha256=L-3guW86Lo360SmiCT5Z9612z2Kj9UZTHHrO4BAYQMo,1063
49
+ python_agent_harness/tools/todo.py,sha256=xmQwcF_LhP9q9MAGVMgL8WmdqKyRLMpCcmv1chDAGTo,1988
50
+ python_agent_harness/tools/write.py,sha256=nhhc-he1pPwJGU7ltJCZ2lcCTJwQbV4s7XlMjPOvozM,1995
51
+ python_agent_harness/tui/__init__.py,sha256=SD8kGsTgroNz2D9gbSG_FGA-f6fsLCwBtQZeTMHiLq8,1451
52
+ python_agent_harness/tui/commands.py,sha256=IB8wHu8rGnVFbJXtpHqW5unmwY45T-4O47JRWsszEtU,27470
53
+ python_agent_harness/tui/core.py,sha256=tajeohfdd_2zyvLZKgHb4pSSwBdSZrZMsFYspLgWaRo,17006
54
+ python_agent_harness/tui/input.py,sha256=XlOjJv_gvJOV4oK-CIv7T0uT12PWoK77Wg-futEYcw0,14491
55
+ python_agent_harness/tui/render.py,sha256=9YbybpcAzhtWKaXZqtxbvjW2IkXiocHTCpkkwaCSWL0,22705
56
+ python_agent_harness-1.5.0.dist-info/licenses/LICENSE,sha256=TiuVaM7FrBunbEua5l_01IT-mwccvS51CLrDLuKW96g,1066
57
+ python_agent_harness-1.5.0.dist-info/METADATA,sha256=XSq4bipgaiKBqtGBmdIjN4KqEfM78j05KvVtRSjFDgQ,11418
58
+ python_agent_harness-1.5.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
59
+ python_agent_harness-1.5.0.dist-info/entry_points.txt,sha256=3PV6goY2PUr9LjVRhDzCEE5fFCJGavuVOrqOTWNnmHE,71
60
+ python_agent_harness-1.5.0.dist-info/top_level.txt,sha256=MQXIVidl0IBeeKnLHhy1JfzXNQMBKAehpdkqHVvIfwM,21
61
+ python_agent_harness-1.5.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ python-agent-harness = python_agent_harness.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 陈虎明
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ python_agent_harness