fram-agent 0.4.8.1__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 (144) hide show
  1. fram/LICENSE +21 -0
  2. fram/__init__.py +14 -0
  3. fram/cli.py +50 -0
  4. fram_agent-0.4.8.1.dist-info/METADATA +38 -0
  5. fram_agent-0.4.8.1.dist-info/RECORD +144 -0
  6. fram_agent-0.4.8.1.dist-info/WHEEL +4 -0
  7. fram_agent-0.4.8.1.dist-info/entry_points.txt +2 -0
  8. tau_agent/__init__.py +70 -0
  9. tau_agent/events.py +87 -0
  10. tau_agent/harness.py +259 -0
  11. tau_agent/loop.py +431 -0
  12. tau_agent/messages.py +317 -0
  13. tau_agent/provider.py +37 -0
  14. tau_agent/provider_events.py +107 -0
  15. tau_agent/py.typed +0 -0
  16. tau_agent/session/__init__.py +53 -0
  17. tau_agent/session/entries.py +144 -0
  18. tau_agent/session/jsonl.py +171 -0
  19. tau_agent/session/memory.py +208 -0
  20. tau_agent/session/storage.py +301 -0
  21. tau_agent/session/tree.py +40 -0
  22. tau_agent/tool_arguments.py +134 -0
  23. tau_agent/tool_history.py +169 -0
  24. tau_agent/tools.py +118 -0
  25. tau_agent/types.py +8 -0
  26. tau_ai/__init__.py +45 -0
  27. tau_ai/_provider_events.py +93 -0
  28. tau_ai/anthropic.py +788 -0
  29. tau_ai/content.py +45 -0
  30. tau_ai/env.py +158 -0
  31. tau_ai/events.py +37 -0
  32. tau_ai/fake.py +41 -0
  33. tau_ai/google.py +527 -0
  34. tau_ai/http.py +81 -0
  35. tau_ai/http_errors.py +65 -0
  36. tau_ai/mistral.py +530 -0
  37. tau_ai/model_catalog.py +53 -0
  38. tau_ai/model_limits.py +48 -0
  39. tau_ai/openai_cache.py +20 -0
  40. tau_ai/openai_codex.py +1205 -0
  41. tau_ai/openai_compatible.py +1388 -0
  42. tau_ai/provider.py +5 -0
  43. tau_ai/py.typed +0 -0
  44. tau_ai/retry.py +71 -0
  45. tau_ai/stream.py +232 -0
  46. tau_ai/tool_call_ids.py +24 -0
  47. tau_coding/__init__.py +317 -0
  48. tau_coding/branch_summary.py +222 -0
  49. tau_coding/built_in_extensions.py +114 -0
  50. tau_coding/catalog_loader.py +796 -0
  51. tau_coding/cli.py +1420 -0
  52. tau_coding/codex_model_store.py +206 -0
  53. tau_coding/codex_version.py +146 -0
  54. tau_coding/commands.py +928 -0
  55. tau_coding/context.py +95 -0
  56. tau_coding/context_window.py +353 -0
  57. tau_coding/credentials.py +260 -0
  58. tau_coding/data/catalog.toml +6882 -0
  59. tau_coding/data/docs/README.md +19 -0
  60. tau_coding/data/docs/architecture.md +60 -0
  61. tau_coding/data/docs/cli.md +72 -0
  62. tau_coding/data/docs/extensions.md +217 -0
  63. tau_coding/data/docs/local-inference.md +242 -0
  64. tau_coding/data/docs/models.md +183 -0
  65. tau_coding/data/docs/security.md +67 -0
  66. tau_coding/data/docs/skills.md +32 -0
  67. tau_coding/data/docs/tui.md +142 -0
  68. tau_coding/data/examples/extensions/ask_user_question.py +95 -0
  69. tau_coding/data/examples/extensions/hello_tool.py +41 -0
  70. tau_coding/data/examples/extensions/prompt_section.py +19 -0
  71. tau_coding/data/examples/extensions/sidebar_status.py +39 -0
  72. tau_coding/data/models-dev-catalog.json +15937 -0
  73. tau_coding/data/release-notes/releases.json +594 -0
  74. tau_coding/diagnostics.py +183 -0
  75. tau_coding/events.py +91 -0
  76. tau_coding/extension_installer.py +200 -0
  77. tau_coding/extensions/__init__.py +239 -0
  78. tau_coding/extensions/api.py +1236 -0
  79. tau_coding/extensions/builtins/__init__.py +1 -0
  80. tau_coding/extensions/builtins/llama_cpp/__init__.py +87 -0
  81. tau_coding/extensions/builtins/llama_cpp/huggingface.py +217 -0
  82. tau_coding/extensions/builtins/llama_cpp/router.py +340 -0
  83. tau_coding/extensions/builtins/llama_cpp/service.py +1781 -0
  84. tau_coding/extensions/builtins/llama_cpp/state.py +411 -0
  85. tau_coding/extensions/loader.py +405 -0
  86. tau_coding/extensions/provider_registry.py +650 -0
  87. tau_coding/extensions/providers.py +527 -0
  88. tau_coding/extensions/runtime.py +1350 -0
  89. tau_coding/image_processing.py +253 -0
  90. tau_coding/local_backends.py +1299 -0
  91. tau_coding/models_dev.py +327 -0
  92. tau_coding/models_dev_store.py +207 -0
  93. tau_coding/oauth.py +527 -0
  94. tau_coding/oauth_anthropic.py +285 -0
  95. tau_coding/oauth_device.py +109 -0
  96. tau_coding/oauth_github_copilot.py +285 -0
  97. tau_coding/oauth_registry.py +55 -0
  98. tau_coding/oauth_types.py +127 -0
  99. tau_coding/paths.py +179 -0
  100. tau_coding/project_trust.py +703 -0
  101. tau_coding/prompt_templates.py +285 -0
  102. tau_coding/provider_catalog.py +111 -0
  103. tau_coding/provider_config.py +2662 -0
  104. tau_coding/provider_runtime.py +506 -0
  105. tau_coding/py.typed +0 -0
  106. tau_coding/reload.py +31 -0
  107. tau_coding/rendering/__init__.py +35 -0
  108. tau_coding/rendering/base.py +27 -0
  109. tau_coding/rendering/json.py +26 -0
  110. tau_coding/rendering/plain.py +38 -0
  111. tau_coding/rendering/transcript.py +106 -0
  112. tau_coding/resources.py +377 -0
  113. tau_coding/rpc.py +799 -0
  114. tau_coding/self_docs.py +23 -0
  115. tau_coding/session.py +5310 -0
  116. tau_coding/session_export.py +1780 -0
  117. tau_coding/session_manager.py +534 -0
  118. tau_coding/session_preparation.py +88 -0
  119. tau_coding/session_stats.py +206 -0
  120. tau_coding/session_usage.py +982 -0
  121. tau_coding/shell_config.py +74 -0
  122. tau_coding/skills.py +255 -0
  123. tau_coding/system_prompt.py +393 -0
  124. tau_coding/thinking.py +93 -0
  125. tau_coding/tools.py +1306 -0
  126. tau_coding/tui/__init__.py +69 -0
  127. tau_coding/tui/adapter.py +162 -0
  128. tau_coding/tui/app.py +9157 -0
  129. tau_coding/tui/autocomplete.py +632 -0
  130. tau_coding/tui/config.py +211 -0
  131. tau_coding/tui/file_drop.py +83 -0
  132. tau_coding/tui/local_backends.py +1313 -0
  133. tau_coding/tui/project_trust.py +184 -0
  134. tau_coding/tui/state.py +975 -0
  135. tau_coding/tui/terminal_notification.py +115 -0
  136. tau_coding/tui/terminal_title.py +124 -0
  137. tau_coding/tui/themes/__init__.py +516 -0
  138. tau_coding/tui/themes/high-contrast.json +48 -0
  139. tau_coding/tui/themes/tau-dark.json +48 -0
  140. tau_coding/tui/themes/tau-light.json +48 -0
  141. tau_coding/tui/widgets.py +3405 -0
  142. tau_coding/update_check.py +419 -0
  143. tau_coding/updater.py +387 -0
  144. tau_coding/version.py +16 -0
fram/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Alejandro AO
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.
fram/__init__.py ADDED
@@ -0,0 +1,14 @@
1
+ """Fram: the Fram fork of Tau, packaged as the ``fram-agent`` distribution.
2
+
3
+ The version's first three parts are the upstream Tau release Fram is based on;
4
+ the fourth counts Fram releases on top of it.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ __version__ = "0.4.8.1"
10
+
11
+
12
+ def tau_base_version(version: str = __version__) -> str:
13
+ """Return the upstream Tau release a Fram version is based on."""
14
+ return ".".join(version.split(".")[:3])
fram/cli.py ADDED
@@ -0,0 +1,50 @@
1
+ """The ``fram`` command: Tau's CLI, run from the ``fram-agent`` distribution.
2
+
3
+ Tau's sources are bundled unchanged, so the few places where Tau assumes it was
4
+ installed as ``tau-ai`` are adjusted here, before Tau's CLI is imported:
5
+
6
+ - ``--version`` names Fram's version and the Tau release it is based on.
7
+ - ``update`` is refused: Tau's updater would install ``tau-ai`` from PyPI.
8
+ - The startup update check is off by default, since it compares against
9
+ ``tau-ai`` on PyPI.
10
+ - Tau's version lookup reads the ``fram-agent`` distribution, so the TUI and the
11
+ release-notes state see Fram's version instead of ``0+unknown``.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import os
17
+ import sys
18
+
19
+ from fram import __version__, tau_base_version
20
+
21
+ _REINSTALL_ADVICE = (
22
+ "fram update is not supported: Tau's updater installs tau-ai from PyPI.\n"
23
+ "Upgrade with: uv tool upgrade fram-agent (or reinstall from your Fram index)"
24
+ )
25
+
26
+
27
+ def main(argv: list[str] | None = None) -> None:
28
+ """Run Tau's CLI as ``fram``."""
29
+ args = sys.argv[1:] if argv is None else argv
30
+ if args in (["--version"], ["-v"]):
31
+ print(f"fram {__version__} (tau {tau_base_version()})")
32
+ return
33
+ if args[:1] == ["update"] and "--models" not in args:
34
+ print(_REINSTALL_ADVICE, file=sys.stderr)
35
+ raise SystemExit(1)
36
+
37
+ adopt_fram_identity()
38
+ from tau_coding.cli import app
39
+
40
+ app(args=args, prog_name="fram")
41
+
42
+
43
+ def adopt_fram_identity() -> None:
44
+ """Point Tau's update check and version lookup at Fram instead of tau-ai."""
45
+ os.environ.setdefault("TAU_NO_UPDATE_CHECK", "1")
46
+ import tau_coding
47
+ import tau_coding.version
48
+
49
+ tau_coding.version._DISTRIBUTION_NAME = "fram-agent"
50
+ tau_coding.__version__ = tau_coding.version.current_version()
@@ -0,0 +1,38 @@
1
+ Metadata-Version: 2.5
2
+ Name: fram-agent
3
+ Version: 0.4.8.1
4
+ Summary: Fram: a fork of the Tau coding-agent harness.
5
+ License-Expression: MIT
6
+ Requires-Python: >=3.12
7
+ Requires-Dist: anyio>=4.0
8
+ Requires-Dist: httpx[socks]>=0.27
9
+ Requires-Dist: packaging>=24.0
10
+ Requires-Dist: pillow>=11.0
11
+ Requires-Dist: pydantic>=2.11
12
+ Requires-Dist: pygments>=2.18
13
+ Requires-Dist: rich>=13.0
14
+ Requires-Dist: textual>=8.2.8
15
+ Requires-Dist: typer>=0.12
16
+ Description-Content-Type: text/markdown
17
+
18
+ # Fram
19
+
20
+ Fram is a fork of [Tau](https://github.com/huggingface/tau), the Python
21
+ coding-agent harness. The `fram-agent` distribution installs the `fram`
22
+ command.
23
+
24
+ It bundles Tau's own packages (`tau_ai`, `tau_agent`, `tau_coding`) under
25
+ their usual import names, so Tau extensions keep working. Because of that,
26
+ `fram` replaces `tau-ai` in any environment it is installed into. Install it
27
+ in its own tool environment:
28
+
29
+ ```bash
30
+ uv tool install fram-agent
31
+ ```
32
+
33
+ The distribution is `fram-agent` because the shorter name `fram` is taken on
34
+ PyPI by an unrelated project. The command is still `fram`.
35
+
36
+ `fram` shares Tau's configuration and sessions (`~/.tau`, or `TAU_HOME`).
37
+ `fram --version` names the Tau release it is based on. `fram update` is not
38
+ supported; upgrade with `uv tool upgrade fram-agent`.
@@ -0,0 +1,144 @@
1
+ fram/__init__.py,sha256=1NBMrHVxOFA7Jx_8YNHepxVt5Kcto9bj42EZCWTiozk,440
2
+ fram/cli.py,sha256=96fKocfi8J9fRZ5qsEeQCY4eHXANqhAnPgBDss_YIgg,1762
3
+ tau_agent/__init__.py,sha256=4aOF0bzKXDxHN7i5WTYVptk-OoSLvlzlGrQogrx3yMY,1570
4
+ tau_agent/events.py,sha256=R6lp1t4SE8sCRAz_0b2C7A3qUYXrGf0tMr1yYDJup-I,2300
5
+ tau_agent/harness.py,sha256=JlB2ROav4-upJQoo8Ux1SfdTOtaQ_fs5UJv0pM08690,9101
6
+ tau_agent/loop.py,sha256=9OGbKCPVHrcTID3TS03dDprspPiWICK-ZN_ywTOvSNY,15112
7
+ tau_agent/messages.py,sha256=mOEO71Tt-XW4MFgZgydh09QSaJ-F2Mjhp6lm9R5n6NQ,9685
8
+ tau_agent/provider.py,sha256=O8qOW1wgiXGViwB6q7c7ef8nmc6bLYt5Nt1HDJVF97g,1071
9
+ tau_agent/provider_events.py,sha256=ZOFBckoQJCc4j3WoSID9loVwJ8qNpVQQKrT8aFmOVRA,2441
10
+ tau_agent/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ tau_agent/tool_arguments.py,sha256=ghAsybb8YFXyd7NLwyaqqNu2DuFKQfalIiVX4qn5s7I,4842
12
+ tau_agent/tool_history.py,sha256=dSKARvmkfmSfEUuOomoSEZLSMrb861o5l0slrN_p6Sw,6782
13
+ tau_agent/tools.py,sha256=tiwHMcl1wapi5xdxvSzJuskuZeZ6CwTm2Pv4fFFWxHw,3555
14
+ tau_agent/types.py,sha256=5fyjqvm83wWh_UR3YsmfBBoy-eNgQWY8c9iBCWGhNI4,333
15
+ tau_agent/session/__init__.py,sha256=9kCQnTqQdO_VV6hBmeDWDyItbY6T94VmEkh_NuLQNe0,1314
16
+ tau_agent/session/entries.py,sha256=ohvupdnZ2BVDUxkblv6xES-knMFedqk5EL0zl6ISReQ,3928
17
+ tau_agent/session/jsonl.py,sha256=iZigYywYXvyoGXCY7iRw_3F1j3K11Oa6_SGAk5-g3r0,7214
18
+ tau_agent/session/memory.py,sha256=iSyM92rHQ0clFO521izRv8DOoI2AIv3W1sCMXkwX3d4,7731
19
+ tau_agent/session/storage.py,sha256=PNfL6MYCJT1WwVLlGSzqGot7n1edvn8pJYjQMWGVfAc,11241
20
+ tau_agent/session/tree.py,sha256=VQ-NGr9jmT3efdf1KDYAzUpaHWeLgYS0iV37DaMDUeY,1296
21
+ tau_ai/__init__.py,sha256=gAnazQvaEY9URfn5TM6oOKyvAbSY6m4f0bLveXWidMs,1477
22
+ tau_ai/_provider_events.py,sha256=sNN2aj8cRANZUq5Z4SJ4olXykYM-lPZg_Ho34fCgiyM,2330
23
+ tau_ai/anthropic.py,sha256=CEnOeYNstnvf7HiWOJbiRcIZiErwDInwRvSdQjz8mj8,33202
24
+ tau_ai/content.py,sha256=v0YixvHctpu4MkDX86UVdgRDZ4kB79P6M_lNmKrgt_g,1686
25
+ tau_ai/env.py,sha256=MVGJdPsQE4nMDm1IkFz7BdNouuYDn9CCbC2BrBEiobc,6221
26
+ tau_ai/events.py,sha256=uQ7Tswj2Ns4ZNfFkCIIP8vZUF0bzLhTvXqYTwagdDdU,826
27
+ tau_ai/fake.py,sha256=CUZhpXbMyHnFOYxR5gD9i4l6l02vmdLAhkcNXm2yaKA,1423
28
+ tau_ai/google.py,sha256=Lp_IA6sMc56IfMMZ_AXm53bZGRhnq1vPi0iW7LeLmlE,20678
29
+ tau_ai/http.py,sha256=V2bHywR5FeD-d0CcIwRLLNUOwZ8AKNXSnemoMytyAf8,2387
30
+ tau_ai/http_errors.py,sha256=kuSGGwkSCi9XLUFHAuR2xjOAXJPJbPmbeYanIiJ7I8Y,2020
31
+ tau_ai/mistral.py,sha256=r02H0fikI5PWc8vG-0SCW7ZPKiNO2UBjHZByDX3pYQs,19556
32
+ tau_ai/model_catalog.py,sha256=C3bTX0j1dWzRS5nUCr7w7aE7F8DmJrhexHWtcz1rNeo,1914
33
+ tau_ai/model_limits.py,sha256=zxC4CbA6lrPhvmbkx_fp8gmJCSOUEzDLvizY-dNZtVk,2077
34
+ tau_ai/openai_cache.py,sha256=jpyLf2jJndg3OVNdgJX0dTuOQU4zmqIlv9jdXQBynzE,628
35
+ tau_ai/openai_codex.py,sha256=-zSxdvWi6rISv5Tyo6lAu8wCguulCI3nIbUAthcmtRQ,45158
36
+ tau_ai/openai_compatible.py,sha256=0xmVT397FZqIcXWDttmI3dK2XwjkbyLh7fg6pvAmnD0,52400
37
+ tau_ai/provider.py,sha256=cXSF3KhYebBTu8RjscDETqGrwbRietSr5AzGsZuxEIc,193
38
+ tau_ai/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
+ tau_ai/retry.py,sha256=hq_E6SYxltQcnOV1tmlOj61-TQ0Y0u6MDRGqhSyKlgM,2272
40
+ tau_ai/stream.py,sha256=nZidxwL9WrnpZ-n9yAWowlA2Ymz5GoPdZHTejtOsKBM,9599
41
+ tau_ai/tool_call_ids.py,sha256=N_eNOIdbNh1hNkMzHQO7PjM2czBBJWLIVA65G94iXzs,928
42
+ tau_coding/__init__.py,sha256=tlChD9X6xt6Z2IqWbjbxJkj6ynz6JgmfPW0wFIKVcrQ,8803
43
+ tau_coding/branch_summary.py,sha256=xVvyyv23CuWmv40E-AcFxVHO4-PXVILHRTJyURXwi3w,7432
44
+ tau_coding/built_in_extensions.py,sha256=NEZQNtG6WndTYQtvp_qUvTXGUSCyjFsTds6NAjHBVSQ,4075
45
+ tau_coding/catalog_loader.py,sha256=-_8TAEiLWpwO8gh8-6sm0dgY-6W4ZgqwXNxHkZw656g,30676
46
+ tau_coding/cli.py,sha256=MbPZm9bh3-u3gD3wvIFvi2u7u4-y2k58Qq0EOAl7TFI,51202
47
+ tau_coding/codex_model_store.py,sha256=1KJta8kvkR3g8AH9q8wEraEAbRLLuMc4ffvdeS6adiw,7344
48
+ tau_coding/codex_version.py,sha256=5zzRCq06qwzqRJbw-t9OLXtPMAi8hRB7W5xFFIqpdl8,5536
49
+ tau_coding/commands.py,sha256=kxscyoIP2_BV3L8TIvwbdUMBROwaGLZ2pFc3Tt7F62M,32097
50
+ tau_coding/context.py,sha256=w_OyqDFDnUpeStw5RaqORakZqE40JRyWsir0Fco2ExA,3265
51
+ tau_coding/context_window.py,sha256=kGXRS_h-1sAVyk2PxwLSA-I1ZzUf6Pq7pglvY_-OgmI,13645
52
+ tau_coding/credentials.py,sha256=qa909Zacyr72eWinnqmY_vBLc4uWXt2OozXQIni_KBU,9619
53
+ tau_coding/diagnostics.py,sha256=Zm85i-10nQaLYbiMAZRUcw0mw7qzClpWmw7vN47gfVE,6242
54
+ tau_coding/events.py,sha256=GKLWSFw2rOopaYlYlLb7rTSFvto2jroUVNYdFhZDwpc,2396
55
+ tau_coding/extension_installer.py,sha256=XUMRcOCuU_aUKq4E0x_l8oRZ6XZd3s4Ru2UAhuIHt04,7442
56
+ tau_coding/image_processing.py,sha256=KBt0Hpan5-jwXTOirveVmANQ7HevqhmxowVhtQZBQDI,9260
57
+ tau_coding/local_backends.py,sha256=0zelIiYn5_iO_rzcK1YtdFe1pUS9EHJu0REOtIw3M0I,48801
58
+ tau_coding/models_dev.py,sha256=NIeQgzHzBjMl160-cytwL8tTk6ejw3lZmdLTvGM9dss,12687
59
+ tau_coding/models_dev_store.py,sha256=gTu6msHKnuK5KlmSGofVoMmvjwNJegx_qZXWpCZmQ9g,7187
60
+ tau_coding/oauth.py,sha256=110a50BIYReqL8xIy3q36YaEjUChrCs-LAkbXbe3MA8,17336
61
+ tau_coding/oauth_anthropic.py,sha256=8i4bv72ZEJVhSTYdKm9NoJrA2l3sPDNOBjAbBEX1Dsw,10054
62
+ tau_coding/oauth_device.py,sha256=HuUjhnwzzjwgNp32L0_UKzHIB505K4f36kQuD3XEef0,3502
63
+ tau_coding/oauth_github_copilot.py,sha256=QOLiAxgB31e40gh6Tnr_PQx8WcHUGcYW5ASiYPNx6P4,10757
64
+ tau_coding/oauth_registry.py,sha256=CCdN8__R5ltDmBWlBu0eDhRjmUJYtzYrqPO3W57PB2k,1998
65
+ tau_coding/oauth_types.py,sha256=qkQpf4ok9IrAGoACR51yWm02gVg_sq1HQjRxQVAGS4Y,3559
66
+ tau_coding/paths.py,sha256=8FULI0uribW6GaYUR_I_AFWGtRYL2jfUCr9lHtsyg5o,6243
67
+ tau_coding/project_trust.py,sha256=PqjDeub6FnLHjJ82nFuEk2VfXXO572gY7HxGBaaHKec,27518
68
+ tau_coding/prompt_templates.py,sha256=to03p4q7rOGUYaHgOXeZNu4RyUcxxUj2eP7z7AG5gBE,10214
69
+ tau_coding/provider_catalog.py,sha256=X6eFnsSJMcdeS1ZVp1QsGV1dp5fOf8Qwu87cv1z-ZUY,3667
70
+ tau_coding/provider_config.py,sha256=PXi_TRT2nUmelYuZ3MNJXLO6MGOwUvKNn3kDUNlAuQM,105866
71
+ tau_coding/provider_runtime.py,sha256=0hKMShcmLDPKqPxzUQQ-vRA7c9WvCeHx-6xf2AGNHEI,21384
72
+ tau_coding/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
+ tau_coding/reload.py,sha256=-09hspeIqg9IVnixS6-ftLhCbdaZBd9mPBNR1hfDt3Q,789
74
+ tau_coding/resources.py,sha256=ir7r4VXBRXF3GAfM9vQTbHHdp5V4ss_xMc3JyOwHoRE,12400
75
+ tau_coding/rpc.py,sha256=Y2Ua9pyz8gAByu1VEcLM6BRdS9SrXbNp8LX36vntS4o,30966
76
+ tau_coding/self_docs.py,sha256=ZsrxAyteP5xjDSgIB3qfBL71eKbEgvWW0ohPjUP48x0,613
77
+ tau_coding/session.py,sha256=MgT61claV2ESH6CijmSs5S4Aut2wB513trKreEyoor8,222926
78
+ tau_coding/session_export.py,sha256=uSa829a1tx9BwSeVmu7yxkPvXGdw8yIHTyiCnwNsits,60249
79
+ tau_coding/session_manager.py,sha256=aV7CSNrmYpK94JjL1riNfJoExyW9ap-Vlk0tjlmyvtk,20499
80
+ tau_coding/session_preparation.py,sha256=S4WIIFCWTaLEQK67WU4ohmclihKNDWogmODcAGJlXH8,3066
81
+ tau_coding/session_stats.py,sha256=qIoL7w26MH-3TymoaE8JqzDFIWQmtTbf5-3UL4dEboY,7946
82
+ tau_coding/session_usage.py,sha256=R5tM7ps6RFtsPrnTygwBcH5X_qyQKTE0saptD65mCTw,36299
83
+ tau_coding/shell_config.py,sha256=hiMRrErt9huKCvzY-Hy6sqqGOjHgJdsliIfAxjp872g,2843
84
+ tau_coding/skills.py,sha256=_OOHDdz9yi9d8_h27cAhh5vyZgi3FfDmSrAwsY8MvYc,9049
85
+ tau_coding/system_prompt.py,sha256=ijTIr0p5LhvPVcM8NOccXuZ8JsbqzW7VAolZYddMsYc,14698
86
+ tau_coding/thinking.py,sha256=JslA93aqkwIfRIA7bNGGNAuViaTVGeWdJGlYcHAR6bk,3046
87
+ tau_coding/tools.py,sha256=hR9XW4JJRvYJbMmkC8nNTRteacp1YISGO_5oZJaP-10,49418
88
+ tau_coding/update_check.py,sha256=sxjgWKaKQZBHF7gdjtGAnfEDmazPZWVeDWLwirT8jRE,14676
89
+ tau_coding/updater.py,sha256=kLJJNbkzYpLOoha96WalpJS92G6qJ9u95e96LB1h0VA,13491
90
+ tau_coding/version.py,sha256=LG3KRHo4XkHrvKizYVKglyKcDNeF4AOfi9itNQt2axg,412
91
+ tau_coding/data/catalog.toml,sha256=6F7GbYnk6INBvcsukaQ6LtTHMgNxHD1t9Z5mmWxeaHs,233824
92
+ tau_coding/data/models-dev-catalog.json,sha256=TMjIGXnQqIzO4W-SJZ19DMWmhwttCKOZG9gTxOeJA4Y,403853
93
+ tau_coding/data/docs/README.md,sha256=uSFwFBMz442ITALD_bpSel0K7hwSt3PnvIOjCDFTyJU,1217
94
+ tau_coding/data/docs/architecture.md,sha256=oirppy4YdQddgGByoUfjOXwEtpuoxzxvP0YQeXZQqqg,3638
95
+ tau_coding/data/docs/cli.md,sha256=TwtdaZ3yl3PbbPWeZ0WMunbtPAz_W-tDMWDJXM4EyoQ,3190
96
+ tau_coding/data/docs/extensions.md,sha256=lEaV30ujx8vX4d6-C4s_s0m5HZtc2neR6NpAYauQss8,13269
97
+ tau_coding/data/docs/local-inference.md,sha256=ueKYvPJ7lLee7L6i2CkQa8eNZk79WMb8JVKFgMj-7hg,11607
98
+ tau_coding/data/docs/models.md,sha256=5Q53Pp2sJatXJUAeoSu26GZtvH0NFc2EsJhOiTNKTmg,9742
99
+ tau_coding/data/docs/security.md,sha256=CGRKAth-6KbjbjRYKauZWtpdwTH7xNvJFLgnlLl-Jao,3636
100
+ tau_coding/data/docs/skills.md,sha256=vDpMUAXUP03TuScdbZh3Bg58fNBT6Rfj4IPgfR14tNk,1834
101
+ tau_coding/data/docs/tui.md,sha256=gMk-EVz2OhGb-NzukSBIlC3GrgWzsKdwCH0U-5Lb0Fw,7999
102
+ tau_coding/data/examples/extensions/ask_user_question.py,sha256=KDDRyOU1V2fNEzDPysQaElwtUjieWuQ1pbFmRFa3Ucs,3442
103
+ tau_coding/data/examples/extensions/hello_tool.py,sha256=AJUYnoinvCsPXKIVXyn-b-o0aiZu4Z3lZkBaCMApIhA,1165
104
+ tau_coding/data/examples/extensions/prompt_section.py,sha256=9qbrvN6psTDDVysEXJ9EhNOWUym4Aya7L_ADsPh7TxY,452
105
+ tau_coding/data/examples/extensions/sidebar_status.py,sha256=ILLBApSpZ98GGtYL6HWcIGgZp_PLPzNXXNgYMj6NU9c,1317
106
+ tau_coding/data/release-notes/releases.json,sha256=C4SpufQ7Ni1ZU97b5ZqlnNvhdfirKQBdiB_YmWsMYJI,31018
107
+ tau_coding/extensions/__init__.py,sha256=fq7MfIHqLBXNeh4_xBHesdpHss6bxeU3nQg-YKO1zQQ,5836
108
+ tau_coding/extensions/api.py,sha256=VP3LGPHDSY3J1HChUUCxeba8Cq3SEBO8TW__0NpfbiU,45310
109
+ tau_coding/extensions/loader.py,sha256=8jJ63lNdv7ehZLguUd6H8KmJUtgbU-LVEfpxsLSJEcg,14212
110
+ tau_coding/extensions/provider_registry.py,sha256=47iSeHHYD075UDhGkcM-7_Cv6-KKl8m64BbM0FtH33E,25953
111
+ tau_coding/extensions/providers.py,sha256=2Z4UQau9IO7_DePdCc2hkkDJapMa4mNBDFSMzk1KOCc,21832
112
+ tau_coding/extensions/runtime.py,sha256=BDYgza4jLoYmzRVW3IJCMxB2RihlhOZcOT6WJ0tzMgc,54066
113
+ tau_coding/extensions/builtins/__init__.py,sha256=8RwaQsjE6IUr8qeUxamm_oYp-xeV-Tddp4_Ncn4BSBk,41
114
+ tau_coding/extensions/builtins/llama_cpp/__init__.py,sha256=qDQlPxpqN-kT50Y2GahC9Qmju9dUVl7dI4hHFi5O4xs,2555
115
+ tau_coding/extensions/builtins/llama_cpp/huggingface.py,sha256=uFlOkbT7i6G5L3PdzrajhL4KOax4R_EhEjXrrytmABY,7511
116
+ tau_coding/extensions/builtins/llama_cpp/router.py,sha256=wjhyU-CAgSWHKILwKfshYZlgwv53B4a6hAI3ZSORm4w,11971
117
+ tau_coding/extensions/builtins/llama_cpp/service.py,sha256=XwiMeRv3w6dfw4OAWuJRQQWwAEc6y8q3ngCOFr9f2a0,71798
118
+ tau_coding/extensions/builtins/llama_cpp/state.py,sha256=3rjeirGFxXQC23R13Qd_S6FOKndavWt7NlhgfSZlrFU,17333
119
+ tau_coding/rendering/__init__.py,sha256=3K81skvR8ENhQyGgLWdS-DH5izqYIYsIFjfCazwsXsw,1056
120
+ tau_coding/rendering/base.py,sha256=0QfYRvr_Xjpdo7pvE18KsizlSilS4C0UGP80xG2ob2A,686
121
+ tau_coding/rendering/json.py,sha256=WgbGkgTBdGlp-gbeLKcpRogYfgDicQg_rTNVq7rqLGQ,825
122
+ tau_coding/rendering/plain.py,sha256=ZXj4qFd2Ytr18qpt0DN9kd4fhEOR1uM-ClXck5zTSuU,1354
123
+ tau_coding/rendering/transcript.py,sha256=I_Qw88Sj00glOBgKBDWPeAiOCExaJ4UcvaWxnWRVlH4,4198
124
+ tau_coding/tui/__init__.py,sha256=uFlbKnex3fsh7DKhpFrMWcZgAU0WOk9LTdGjNBrd1r8,1690
125
+ tau_coding/tui/adapter.py,sha256=S-bPnopJr6Ve1PGjHHlz-062AsMVfvGRRGd8X40aBW4,7720
126
+ tau_coding/tui/app.py,sha256=oGkYDZfppw2d20lyLvnhVBhQmOPxZPnF3vyE7LHqZFo,357608
127
+ tau_coding/tui/autocomplete.py,sha256=JZqcnjnyFAal_dGUFM5ojcJyzczq8Oq12h6_EMcLi8c,20163
128
+ tau_coding/tui/config.py,sha256=GLeBwajYNC1NRLAJY3IoaHaxAC5Pc_LRy-PVAMgHYxA,7505
129
+ tau_coding/tui/file_drop.py,sha256=h-_gSgCCAKGmK9CPB-T191ivItGecDM79T-f2SSaKj4,2811
130
+ tau_coding/tui/local_backends.py,sha256=NsiGenm7V3_XyScZQj2SheN2AdAyDtFD51QVLDKg_vM,51663
131
+ tau_coding/tui/project_trust.py,sha256=uMi-7D81jVqfLsrJswNQI-nThpqUIjXWQY5ZCkRif5E,6114
132
+ tau_coding/tui/state.py,sha256=Ubyplyst24T-aQLY-zC-V_Wk6-qKjrYXpn6om-XFrlM,38230
133
+ tau_coding/tui/terminal_notification.py,sha256=V4RI-MYCrRGd_f8dAfMRnpNLDK66fi8QJBaBEKAGxqw,3947
134
+ tau_coding/tui/terminal_title.py,sha256=oF5v83h1udCLLKtBSyGitEBcy4fLj_NNo6n-LclLzao,4215
135
+ tau_coding/tui/widgets.py,sha256=M6xu81ET_2HAQsFZg6Cetxx4p68VqwfjBU74jANjA20,123097
136
+ tau_coding/tui/themes/__init__.py,sha256=YtZnp2n0RSBYxx8538Czh4hBPxQHzYP5N9RdkVQxNE4,17866
137
+ tau_coding/tui/themes/high-contrast.json,sha256=yUquHoBFfasr996JZA7pkEXsze8jYRCTVN9CvXBDjSw,1844
138
+ tau_coding/tui/themes/tau-dark.json,sha256=AEJ9q7zpNCWGnGQi1FL-wtzo7KUFJHykj3-j2Q4q00Q,1861
139
+ tau_coding/tui/themes/tau-light.json,sha256=725QKgDCdLPXfTUeTpIUw9hHfTR9MO8uprCXUU8I7UY,1765
140
+ fram/LICENSE,sha256=k5eUUkj0GSQL8v4whxU2BOa5fZDMr5zwfI1XQVcraGA,1069
141
+ fram_agent-0.4.8.1.dist-info/METADATA,sha256=rCmzI7VG6apTHrfuSJdmjNsn_GsP7I_DKLv2OhXiC-8,1261
142
+ fram_agent-0.4.8.1.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
143
+ fram_agent-0.4.8.1.dist-info/entry_points.txt,sha256=_yi6A_iDTQzxgv42L7KsXrsjdXRj3igJ7HeFk3OF3XQ,39
144
+ fram_agent-0.4.8.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.33.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ fram = fram.cli:main
tau_agent/__init__.py ADDED
@@ -0,0 +1,70 @@
1
+ """Portable Pi-compatible agent harness primitives for Tau."""
2
+
3
+ # ruff: noqa: F401 - this module intentionally defines the public facade
4
+
5
+ from tau_agent.events import (
6
+ AgentEndEvent,
7
+ AgentEvent,
8
+ AgentStartEvent,
9
+ MessageEndEvent,
10
+ MessageStartEvent,
11
+ MessageUpdateEvent,
12
+ ToolExecutionEndEvent,
13
+ ToolExecutionStartEvent,
14
+ ToolExecutionUpdateEvent,
15
+ TurnEndEvent,
16
+ TurnStartEvent,
17
+ )
18
+ from tau_agent.harness import (
19
+ AgentHarness,
20
+ AgentHarnessConfig,
21
+ EventListener,
22
+ QueuedMessages,
23
+ SimpleCancellationToken,
24
+ )
25
+ from tau_agent.loop import run_agent_loop
26
+ from tau_agent.messages import (
27
+ AgentMessage,
28
+ AssistantMessage,
29
+ BashExecutionMessage,
30
+ BranchSummaryMessage,
31
+ CompactionSummaryMessage,
32
+ CustomMessage,
33
+ ImageContent,
34
+ ResponseTiming,
35
+ TextContent,
36
+ ThinkingContent,
37
+ ToolCall,
38
+ ToolResultMessage,
39
+ Usage,
40
+ UsageCost,
41
+ UserMessage,
42
+ content_text,
43
+ message_text,
44
+ )
45
+ from tau_agent.session import (
46
+ BranchSummaryEntry,
47
+ CompactionEntry,
48
+ CustomEntry,
49
+ CustomMessageEntry,
50
+ JsonlSessionStorage,
51
+ LabelEntry,
52
+ LeafEntry,
53
+ MessageEntry,
54
+ ModelChangeEntry,
55
+ SessionEntry,
56
+ SessionInfoEntry,
57
+ SessionState,
58
+ ThinkingLevelChangeEntry,
59
+ )
60
+ from tau_agent.tools import (
61
+ AgentTool,
62
+ AgentToolResult,
63
+ ToolCancellationToken,
64
+ ToolExecutionMode,
65
+ ToolExecutor,
66
+ ToolUpdateCallback,
67
+ )
68
+ from tau_agent.types import JSONObject, JSONPrimitive, JSONValue
69
+
70
+ __all__ = [name for name in globals() if not name.startswith("_")]
tau_agent/events.py ADDED
@@ -0,0 +1,87 @@
1
+ """Pi-compatible events emitted by Tau's portable agent layer."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Annotated, Literal
6
+
7
+ from pydantic import Field
8
+
9
+ from tau_agent.messages import AgentMessage, ToolResultMessage, WireModel
10
+ from tau_agent.provider_events import AssistantMessageEvent
11
+ from tau_agent.tools import AgentToolResult
12
+ from tau_agent.types import JSONValue
13
+
14
+
15
+ class AgentStartEvent(WireModel):
16
+ type: Literal["agent_start"] = "agent_start"
17
+
18
+
19
+ class AgentEndEvent(WireModel):
20
+ type: Literal["agent_end"] = "agent_end"
21
+ messages: list[AgentMessage] = Field(default_factory=list)
22
+
23
+
24
+ class TurnStartEvent(WireModel):
25
+ type: Literal["turn_start"] = "turn_start"
26
+
27
+
28
+ class TurnEndEvent(WireModel):
29
+ type: Literal["turn_end"] = "turn_end"
30
+ message: AgentMessage
31
+ tool_results: list[ToolResultMessage] = Field(default_factory=list)
32
+
33
+
34
+ class MessageStartEvent(WireModel):
35
+ type: Literal["message_start"] = "message_start"
36
+ message: AgentMessage
37
+
38
+
39
+ class MessageUpdateEvent(WireModel):
40
+ type: Literal["message_update"] = "message_update"
41
+ message: AgentMessage
42
+ assistant_message_event: AssistantMessageEvent = Field(
43
+ serialization_alias="assistantMessageEvent"
44
+ )
45
+
46
+
47
+ class MessageEndEvent(WireModel):
48
+ type: Literal["message_end"] = "message_end"
49
+ message: AgentMessage
50
+
51
+
52
+ class ToolExecutionStartEvent(WireModel):
53
+ type: Literal["tool_execution_start"] = "tool_execution_start"
54
+ tool_call_id: str
55
+ tool_name: str
56
+ args: dict[str, JSONValue] = Field(default_factory=dict)
57
+
58
+
59
+ class ToolExecutionUpdateEvent(WireModel):
60
+ type: Literal["tool_execution_update"] = "tool_execution_update"
61
+ tool_call_id: str
62
+ tool_name: str
63
+ args: dict[str, JSONValue] = Field(default_factory=dict)
64
+ partial_result: AgentToolResult
65
+
66
+
67
+ class ToolExecutionEndEvent(WireModel):
68
+ type: Literal["tool_execution_end"] = "tool_execution_end"
69
+ tool_call_id: str
70
+ tool_name: str
71
+ result: AgentToolResult
72
+ is_error: bool
73
+
74
+
75
+ type AgentEvent = Annotated[
76
+ AgentStartEvent
77
+ | AgentEndEvent
78
+ | TurnStartEvent
79
+ | TurnEndEvent
80
+ | MessageStartEvent
81
+ | MessageUpdateEvent
82
+ | MessageEndEvent
83
+ | ToolExecutionStartEvent
84
+ | ToolExecutionUpdateEvent
85
+ | ToolExecutionEndEvent,
86
+ Field(discriminator="type"),
87
+ ]