ffwf-tau-coding-agent 0.9.2__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.
- ffwf_tau_coding_agent-0.9.2.dist-info/METADATA +166 -0
- ffwf_tau_coding_agent-0.9.2.dist-info/RECORD +24 -0
- ffwf_tau_coding_agent-0.9.2.dist-info/WHEEL +5 -0
- ffwf_tau_coding_agent-0.9.2.dist-info/entry_points.txt +3 -0
- ffwf_tau_coding_agent-0.9.2.dist-info/licenses/LICENSE +21 -0
- ffwf_tau_coding_agent-0.9.2.dist-info/top_level.txt +1 -0
- tau_coding_agent/__init__.py +33 -0
- tau_coding_agent/app.py +5014 -0
- tau_coding_agent/backends.py +1825 -0
- tau_coding_agent/chat_widgets.py +487 -0
- tau_coding_agent/cli.py +710 -0
- tau_coding_agent/config.py +115 -0
- tau_coding_agent/devshot.py +119 -0
- tau_coding_agent/headless.py +973 -0
- tau_coding_agent/parley.tcss +797 -0
- tau_coding_agent/rpc_mode.py +395 -0
- tau_coding_agent/session_store.py +912 -0
- tau_coding_agent/store_factory.py +265 -0
- tau_coding_agent/tagline.py +66 -0
- tau_coding_agent/tau_default_config.json +23 -0
- tau_coding_agent/testing/__init__.py +38 -0
- tau_coding_agent/testing/render.py +273 -0
- tau_coding_agent/testing/sandbox.py +108 -0
- tau_coding_agent/testing/scenes.py +591 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ffwf-tau-coding-agent
|
|
3
|
+
Version: 0.9.2
|
|
4
|
+
Summary: τ-coding-agent: Interactive TUI (Textual) + CLI
|
|
5
|
+
Author: Fight Fire with Fire Robotics, LLC
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://ffwfrobotics.github.io/tau/
|
|
8
|
+
Project-URL: Documentation, https://ffwfrobotics.github.io/tau/
|
|
9
|
+
Project-URL: Repository, https://github.com/jmccardle/tau
|
|
10
|
+
Project-URL: Issues, https://github.com/jmccardle/tau/issues
|
|
11
|
+
Requires-Python: >=3.11
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Requires-Dist: ffwf-tau-agent-core==0.9.2
|
|
15
|
+
Provides-Extra: tui
|
|
16
|
+
Requires-Dist: textual>=0.47; extra == "tui"
|
|
17
|
+
Requires-Dist: rich; extra == "tui"
|
|
18
|
+
Provides-Extra: jmfts
|
|
19
|
+
Requires-Dist: ffwf-tau-jmfts==0.9.2; extra == "jmfts"
|
|
20
|
+
Provides-Extra: dev
|
|
21
|
+
Requires-Dist: ffwf-tau-coding-agent[jmfts,tui]==0.9.2; extra == "dev"
|
|
22
|
+
Requires-Dist: pytest; extra == "dev"
|
|
23
|
+
Requires-Dist: pytest-asyncio; extra == "dev"
|
|
24
|
+
Requires-Dist: ruff; extra == "dev"
|
|
25
|
+
Requires-Dist: mypy==2.1.*; extra == "dev"
|
|
26
|
+
Requires-Dist: textual-dev; extra == "dev"
|
|
27
|
+
Requires-Dist: pytest-textual-snapshot; extra == "dev"
|
|
28
|
+
Requires-Dist: cairosvg; extra == "dev"
|
|
29
|
+
Dynamic: license-file
|
|
30
|
+
|
|
31
|
+
# ffwf-tau-coding-agent
|
|
32
|
+
|
|
33
|
+
The interface of **Tau**, a programmable coding agent harness: the `tau`
|
|
34
|
+
command, its Textual terminal UI, and the headless run paths behind `tau -p` and
|
|
35
|
+
`tau --mode rpc`.
|
|
36
|
+
|
|
37
|
+
Tau began as a Python port of the TypeScript project
|
|
38
|
+
[pi-mono](https://github.com/badlogic/pi-mono), which is still read as the
|
|
39
|
+
reference implementation when porting or debugging; it now diverges from pi
|
|
40
|
+
deliberately in several places.
|
|
41
|
+
|
|
42
|
+
## Install
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pip install ffwf-tau-coding-agent # headless: the CLI, `tau -p`, `--mode rpc`
|
|
46
|
+
pip install 'ffwf-tau-coding-agent[tui]' # add the interactive TUI
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Python 3.11 or newer. Pulls in `ffwf-tau-agent-core`, and through it
|
|
50
|
+
`ffwf-tau-llm`. Note the `ffwf-` prefix: `tau-llm` and `tau-ai` on PyPI are
|
|
51
|
+
unrelated projects.
|
|
52
|
+
|
|
53
|
+
| Extra | Adds | Needed for |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| `ffwf-tau-coding-agent[tui]` | `textual`, `rich` | the interactive TUI. `tau -p` runs a full turn without it |
|
|
56
|
+
| `ffwf-tau-coding-agent[jmfts]` | `ffwf-tau-jmfts` | `--store jmfts` session storage |
|
|
57
|
+
|
|
58
|
+
**The interface is an extra, not a base dependency.** A headless install is 15
|
|
59
|
+
packages and 13 MB; adding `[tui]` makes it 27 packages and 31 MB. Both extras
|
|
60
|
+
report their own absence — asking for the TUI or for `--store jmfts` without the
|
|
61
|
+
matching extra fails with the install command you need, not a traceback.
|
|
62
|
+
|
|
63
|
+
### Two names for one command
|
|
64
|
+
|
|
65
|
+
The install puts **both `tau` and `ffwf-tau`** on your PATH. They are the same
|
|
66
|
+
entry point, not a link: each is a wrapper pip owns and removes on uninstall.
|
|
67
|
+
|
|
68
|
+
Type `tau`. PyPI reserves distribution names but not command names, and at least
|
|
69
|
+
one unrelated project ships its own `tau`; in an environment holding both,
|
|
70
|
+
whichever installed last owns the name and neither pip nor uv says a word.
|
|
71
|
+
`ffwf-tau` cannot be taken, which makes it the right name inside scripts,
|
|
72
|
+
systemd units, and Dockerfiles. If `tau --version` does not report τ,
|
|
73
|
+
`ffwf-tau --version` will.
|
|
74
|
+
|
|
75
|
+
## Run
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
tau # interactive TUI
|
|
79
|
+
tau -p "list the files here" # headless: print a transcript, exit
|
|
80
|
+
tau -p --mode json "..." # headless: JSONL lifecycle events instead of text
|
|
81
|
+
tau --mode rpc # drive τ as a subprocess over stdio (JSON-RPC 2.0)
|
|
82
|
+
tau -e permission_gate.py # load an extension from a path
|
|
83
|
+
tau --help # the exact contract; treat this page as the stale one
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
`tau -p` and `tau --mode rpc` both write and resume real sessions under
|
|
87
|
+
`~/.tau/sessions/`, so a headless run appears in the TUI's sidebar and can be
|
|
88
|
+
picked up interactively later. `--no-session` means nothing is persisted.
|
|
89
|
+
|
|
90
|
+
Flags worth knowing: `-m/--model`, `-t/--tools` and `-nt/--no-tools`,
|
|
91
|
+
`-e/--extension PATH`, `--thinking {off,minimal,low,medium,high,xhigh}`,
|
|
92
|
+
`-c/--continue`, `--session REF`, `--fork REF`, `--store {file,jmfts}`.
|
|
93
|
+
|
|
94
|
+
## Configure
|
|
95
|
+
|
|
96
|
+
On first run τ writes `~/.tau/config.json` from a default shipped inside the
|
|
97
|
+
package. It holds the `models` map that `--model` resolves names against, plus
|
|
98
|
+
per-extension config and the `session_store` block. A model entry names the
|
|
99
|
+
provider, the base URL, and the context window, so pointing τ at a local
|
|
100
|
+
OpenAI-compatible server (vLLM, llama.cpp, Ollama) is a config edit rather than
|
|
101
|
+
a code change.
|
|
102
|
+
|
|
103
|
+
## The TUI
|
|
104
|
+
|
|
105
|
+
Built on [Textual](https://textual.textualize.io/). Streamed text renders at
|
|
106
|
+
30 Hz; tool calls and their results appear as their own blocks.
|
|
107
|
+
|
|
108
|
+
| Key | Action |
|
|
109
|
+
|---|---|
|
|
110
|
+
| `Ctrl+Enter` | send the message |
|
|
111
|
+
| `Ctrl+B` | toggle the session sidebar |
|
|
112
|
+
| `Ctrl+N` | new chat |
|
|
113
|
+
| `Ctrl+G` | browse the conversation tree |
|
|
114
|
+
| `Ctrl+Z` | roll back the last turn |
|
|
115
|
+
| `Ctrl+R` / `Ctrl+T` | show or hide reasoning / tool blocks |
|
|
116
|
+
| `Ctrl+E` | extensions |
|
|
117
|
+
| `Ctrl+P` | command palette |
|
|
118
|
+
| `Escape` | cancel the current generation |
|
|
119
|
+
|
|
120
|
+
**The sidebar and the tree browser are two different things.** The sidebar picks
|
|
121
|
+
*which session to open* — a flat list grouped by date. `Ctrl+G` opens a browser
|
|
122
|
+
over the branch structure *inside the current conversation*, where you navigate
|
|
123
|
+
to an earlier node, summarise a branch, or elide a span. Typed commands cover
|
|
124
|
+
the rest: `/compact`, `/tree`, `/fork`, `/extensions`.
|
|
125
|
+
|
|
126
|
+
## Why it is a separate package
|
|
127
|
+
|
|
128
|
+
Everything here is presentation and process management. The agent lives in
|
|
129
|
+
`ffwf-tau-agent-core`, which has no Textual dependency and never imports this
|
|
130
|
+
package. `ffwf-tau-jmfts` is a peer rather than a dependency: `--store jmfts`
|
|
131
|
+
imports it lazily and fails at startup if it is absent, never falling back to
|
|
132
|
+
files without saying so.
|
|
133
|
+
|
|
134
|
+
If you want the agent rather than the interface, use the runtime directly:
|
|
135
|
+
|
|
136
|
+
```python
|
|
137
|
+
import asyncio
|
|
138
|
+
from tau_agent_core import create_agent_session
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
async def main():
|
|
142
|
+
session = create_agent_session(model="gpt-4o", tools=["read", "bash"])
|
|
143
|
+
print(await session.prompt("What is in this directory?"))
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
asyncio.run(main())
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Docs
|
|
150
|
+
|
|
151
|
+
- `docs/tau-coding-agent.md` — design notes for this package.
|
|
152
|
+
- `docs/CLI-PLAN.md` — the flag set and its status.
|
|
153
|
+
- `docs/REMOTE-CONTROL.md`, `docs/RPC-PROTOCOL.md` — `--mode rpc`.
|
|
154
|
+
- `docs/EXTENSIONS-WALKTHROUGH.md` — writing an extension to load with `-e`.
|
|
155
|
+
|
|
156
|
+
Repository: <https://github.com/jmccardle/tau>
|
|
157
|
+
|
|
158
|
+
## The rest of Tau
|
|
159
|
+
|
|
160
|
+
| Distribution | Imports as | What it is |
|
|
161
|
+
|---|---|---|
|
|
162
|
+
| `ffwf-tau-llm` | `tau_llm` | the provider and streaming layer |
|
|
163
|
+
| `ffwf-tau-agent-core` | `tau_agent_core` | the agent loop, tools, sessions, extensions |
|
|
164
|
+
| `ffwf-tau-jmfts` | `tau_jmfts` | a JMFTS-backed session store |
|
|
165
|
+
|
|
166
|
+
MIT © Fight Fire with Fire Robotics, LLC
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
ffwf_tau_coding_agent-0.9.2.dist-info/licenses/LICENSE,sha256=sP7VRq7RIYzX1msY2Bg961He7KvN0iRhcMGFrE2wRVc,1091
|
|
2
|
+
tau_coding_agent/__init__.py,sha256=mKx9P7iNsWDPTFe8I0KyzY_dTJ8k_FQ6cjc0j_2rFHw,971
|
|
3
|
+
tau_coding_agent/app.py,sha256=VeWiR7WtgGSYM54zWt37Kwl45d6HmogVbp9i7pPAWnc,247625
|
|
4
|
+
tau_coding_agent/backends.py,sha256=INPk-lfUSUZyYX-YSHoSRwP8syPpgmUhWzUSfWo7oEc,94128
|
|
5
|
+
tau_coding_agent/chat_widgets.py,sha256=B5QewyNzz2xa240rXaD3McjOWGJ8j3pr2lLqr4Fy4vs,22730
|
|
6
|
+
tau_coding_agent/cli.py,sha256=ZbAVhy5fIopOC6UgccLvCXvV4D5WOjA39EzfMRrVdWA,32305
|
|
7
|
+
tau_coding_agent/config.py,sha256=MzuH4ZOQlJxtnCeygHCv4mDNp1BL_6N37_gqZeS56s8,4731
|
|
8
|
+
tau_coding_agent/devshot.py,sha256=rAUbm20s51dYJa7Xe1feanIdRkjlIFOcvAv7Efat2QU,3621
|
|
9
|
+
tau_coding_agent/headless.py,sha256=4X-qVUkbIqmPAdTpBc8DfK8pd1bg41aMCEasExsgxo8,50544
|
|
10
|
+
tau_coding_agent/parley.tcss,sha256=avFVPSu1xjVsvzsuiYWCyGZ4YYcPEHNMsA4qNRA9Hgo,24561
|
|
11
|
+
tau_coding_agent/rpc_mode.py,sha256=6SsasalxjiR_DFpSK_Qy6ph3h_nbtH8MIrzTBnX4n-U,22058
|
|
12
|
+
tau_coding_agent/session_store.py,sha256=cCLxy6l_RDR02YJO1rOWYJC0RlPkeFnYOo6qSmbPyrY,41110
|
|
13
|
+
tau_coding_agent/store_factory.py,sha256=-QCWZt4XlvrVZStrtPJaOnwQZSJxJ8l3wqQAfw4YGiE,13030
|
|
14
|
+
tau_coding_agent/tagline.py,sha256=w90ysJsu56BGfpi4HD2hv7K4lyfbs9MjZP40wxG5CZQ,2819
|
|
15
|
+
tau_coding_agent/tau_default_config.json,sha256=Y8H9UE24rsScX2f7CQ0Gp_8uSNsAEcyMmuz_9Qu_7qI,700
|
|
16
|
+
tau_coding_agent/testing/__init__.py,sha256=8iFUd7msxkxC1Nx3qoLRX-YiPbmXONnfBbWN6N5OTzg,1269
|
|
17
|
+
tau_coding_agent/testing/render.py,sha256=Uj8SxgoOcHQa0DUVT94PsM0QynGZZOR2-4RQJvWGtfE,9666
|
|
18
|
+
tau_coding_agent/testing/sandbox.py,sha256=QePNu8ma1RK7smLAB-jp1BAQeEOS9Jp9p0FWwL96qdk,4191
|
|
19
|
+
tau_coding_agent/testing/scenes.py,sha256=aunUkSsViah5EjvFCqF1BpPJmZrykO0TqE3eXiSV_EI,23077
|
|
20
|
+
ffwf_tau_coding_agent-0.9.2.dist-info/METADATA,sha256=u6WBOaHfC_c1-0iOJKCJPto0fs5jxia1AJQzQ40TkTA,6711
|
|
21
|
+
ffwf_tau_coding_agent-0.9.2.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
22
|
+
ffwf_tau_coding_agent-0.9.2.dist-info/entry_points.txt,sha256=_QgIxAjOBq2pmF507q3ZgJcD3lUJspc0SVp3TYBIvfM,87
|
|
23
|
+
ffwf_tau_coding_agent-0.9.2.dist-info/top_level.txt,sha256=Q5vyx1Q5e8R18rKmqSoIcuEmclaT5g2yKdrYcRU8LKs,17
|
|
24
|
+
ffwf_tau_coding_agent-0.9.2.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Fight Fire with Fire Robotics, LLC
|
|
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
|
+
tau_coding_agent
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""τ-coding-agent: Interactive TUI + CLI for τ-agent-core.
|
|
2
|
+
|
|
3
|
+
Public API:
|
|
4
|
+
- AgentSession: Re-exported from τ-agent-core
|
|
5
|
+
- SessionManager: Re-exported from τ-agent-core
|
|
6
|
+
- AgentEvent: Re-exported from τ-agent-core
|
|
7
|
+
|
|
8
|
+
Reference: SUBPHASE-0.0.md, "AgentSession Interface" section.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# This package's release version. The CLI ``--version`` flag, ``package.sh`` and
|
|
12
|
+
# this distribution's own ``pyproject.toml`` (``[tool.setuptools.dynamic]``) all
|
|
13
|
+
# read this literal, so the number a user sees and the number on the wheel cannot
|
|
14
|
+
# disagree. The other three packages carry the same line; tests/test_packaging.py
|
|
15
|
+
# holds all four against each other, because they are released in lockstep.
|
|
16
|
+
__version__ = "0.9.2"
|
|
17
|
+
|
|
18
|
+
from tau_agent_core import (
|
|
19
|
+
AgentSession,
|
|
20
|
+
SessionManager,
|
|
21
|
+
AgentEvent,
|
|
22
|
+
ExtensionAPI,
|
|
23
|
+
ExtensionContext,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
__all__ = [
|
|
27
|
+
"__version__",
|
|
28
|
+
"AgentSession",
|
|
29
|
+
"SessionManager",
|
|
30
|
+
"AgentEvent",
|
|
31
|
+
"ExtensionAPI",
|
|
32
|
+
"ExtensionContext",
|
|
33
|
+
]
|