1111import tempfile
1212from typing import Protocol , Self , override
1313
14- from .common import UnreachableError
14+ from .common import UnreachableError , UserFeedback
1515from .git import SHA , GitError , Repo , null_delimited
1616
1717
@@ -32,10 +32,6 @@ class Toolbox:
3232 # TODO: Support a diff-based edit method.
3333 # https://gist.github.com/noporpoise/16e731849eb1231e86d78f9dfeca3abc
3434
35- # TODO: Add user feedback tool here. This will make it possible to request
36- # feedback more than once during a bot action, which leads to a better
37- # experience when used interactively.
38-
3935 def __init__ (self , visitors : Sequence [ToolVisitor ] | None = None ) -> None :
4036 self ._visitors = visitors or []
4137
@@ -133,13 +129,15 @@ def on_delete_file(
133129 ) -> None : ... # pragma: no cover
134130
135131 def on_rename_file (
136- self ,
137- src_path : PurePosixPath ,
138- dst_path : PurePosixPath ,
132+ self , src_path : PurePosixPath , dst_path : PurePosixPath
139133 ) -> None : ... # pragma: no cover
140134
141135 def on_expose_files (self ) -> None : ... # pragma: no cover
142136
137+ def on_request_feedback (
138+ self , question : str
139+ ) -> None : ... # pragma: no cover
140+
143141
144142class NoopToolbox (Toolbox ):
145143 """No-op read-only toolbox"""
@@ -179,18 +177,22 @@ def __init__(
179177 self ,
180178 repo : Repo ,
181179 start_rev : SHA ,
180+ user_feedback : UserFeedback | None = None ,
182181 visitors : Sequence [ToolVisitor ] | None = None ,
183182 ) -> None :
184183 super ().__init__ (visitors )
185184 call = repo .git ("rev-parse" , "--verify" , f"{ start_rev } ^{{tree}}" )
186185 self ._tree_sha = call .stdout
187186 self ._tree_updates = list [_TreeUpdate ]()
188187 self ._repo = repo
188+ self ._user_feedback = user_feedback
189189
190190 @classmethod
191- def for_working_dir (cls , repo : Repo ) -> tuple [Self , bool ]:
191+ def for_working_dir (
192+ cls , repo : Repo , user_feedback : UserFeedback | None = None
193+ ) -> tuple [Self , bool ]:
192194 index_tree_sha = repo .git ("write-tree" ).stdout
193- toolbox = cls (repo , index_tree_sha )
195+ toolbox = cls (repo , user_feedback , index_tree_sha )
194196 toolbox ._sync_updates () # Apply any changes from the working directory
195197 head_tree_sha = repo .git ("rev-parse" , "HEAD^{tree}" ).stdout
196198 return toolbox , toolbox .tree_sha () != head_tree_sha
0 commit comments