shotgun-sh 0.1.0.dev17__py3-none-any.whl → 0.1.0.dev18__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.
Potentially problematic release.
This version of shotgun-sh might be problematic. Click here for more details.
- shotgun/agents/agent_manager.py +28 -13
- shotgun/agents/tools/user_interaction.py +2 -1
- shotgun/codebase/core/manager.py +9 -3
- shotgun/prompts/agents/research.j2 +1 -1
- shotgun/tui/screens/chat.py +17 -1
- shotgun/tui/screens/chat_screen/history.py +81 -30
- {shotgun_sh-0.1.0.dev17.dist-info → shotgun_sh-0.1.0.dev18.dist-info}/METADATA +1 -1
- {shotgun_sh-0.1.0.dev17.dist-info → shotgun_sh-0.1.0.dev18.dist-info}/RECORD +11 -11
- {shotgun_sh-0.1.0.dev17.dist-info → shotgun_sh-0.1.0.dev18.dist-info}/WHEEL +0 -0
- {shotgun_sh-0.1.0.dev17.dist-info → shotgun_sh-0.1.0.dev18.dist-info}/entry_points.txt +0 -0
- {shotgun_sh-0.1.0.dev17.dist-info → shotgun_sh-0.1.0.dev18.dist-info}/licenses/LICENSE +0 -0
shotgun/agents/agent_manager.py
CHANGED
|
@@ -17,17 +17,23 @@ from pydantic_ai.agent import AgentRunResult
|
|
|
17
17
|
from pydantic_ai.messages import (
|
|
18
18
|
AgentStreamEvent,
|
|
19
19
|
FinalResultEvent,
|
|
20
|
+
FunctionToolCallEvent,
|
|
21
|
+
FunctionToolResultEvent,
|
|
20
22
|
ModelMessage,
|
|
21
23
|
ModelRequest,
|
|
22
24
|
ModelResponse,
|
|
23
25
|
ModelResponsePart,
|
|
24
26
|
PartDeltaEvent,
|
|
25
27
|
PartStartEvent,
|
|
28
|
+
SystemPromptPart,
|
|
29
|
+
ToolCallPart,
|
|
26
30
|
ToolCallPartDelta,
|
|
27
31
|
)
|
|
28
32
|
from textual.message import Message
|
|
29
33
|
from textual.widget import Widget
|
|
30
34
|
|
|
35
|
+
from shotgun.agents.common import add_system_prompt_message
|
|
36
|
+
|
|
31
37
|
from .history.compaction import apply_persistent_compaction
|
|
32
38
|
from .models import AgentDeps, AgentRuntimeOptions, FileOperation
|
|
33
39
|
from .plan import create_plan_agent
|
|
@@ -264,11 +270,6 @@ class AgentManager(Widget):
|
|
|
264
270
|
self.ui_message_history.append(ModelRequest.user_text_prompt(prompt))
|
|
265
271
|
self._post_messages_updated()
|
|
266
272
|
|
|
267
|
-
# Ensure system prompt is added to message history before running agent
|
|
268
|
-
from pydantic_ai.messages import SystemPromptPart
|
|
269
|
-
|
|
270
|
-
from shotgun.agents.common import add_system_prompt_message
|
|
271
|
-
|
|
272
273
|
# Start with persistent message history
|
|
273
274
|
message_history = self.message_history
|
|
274
275
|
|
|
@@ -389,19 +390,33 @@ class AgentManager(Widget):
|
|
|
389
390
|
state.latest_partial = partial_message
|
|
390
391
|
self._post_partial_message(partial_message, False)
|
|
391
392
|
|
|
393
|
+
elif isinstance(event, FunctionToolCallEvent):
|
|
394
|
+
existing_call_idx = next(
|
|
395
|
+
(
|
|
396
|
+
i
|
|
397
|
+
for i, part in enumerate(partial_parts)
|
|
398
|
+
if isinstance(part, ToolCallPart)
|
|
399
|
+
and part.tool_call_id == event.part.tool_call_id
|
|
400
|
+
),
|
|
401
|
+
None,
|
|
402
|
+
)
|
|
403
|
+
if existing_call_idx is not None:
|
|
404
|
+
partial_parts[existing_call_idx] = event.part
|
|
405
|
+
else:
|
|
406
|
+
partial_parts.append(event.part)
|
|
407
|
+
partial_message = self._build_partial_response(partial_parts)
|
|
408
|
+
if partial_message is not None:
|
|
409
|
+
state.latest_partial = partial_message
|
|
410
|
+
self._post_partial_message(partial_message, False)
|
|
411
|
+
elif isinstance(event, FunctionToolResultEvent):
|
|
412
|
+
self.ui_message_history.append(ModelRequest(parts=[event.result]))
|
|
413
|
+
self._post_messages_updated() ## this is what the user responded with
|
|
392
414
|
elif isinstance(event, FinalResultEvent):
|
|
393
415
|
final_message = (
|
|
394
416
|
state.latest_partial
|
|
395
417
|
or self._build_partial_response(partial_parts)
|
|
396
418
|
)
|
|
397
|
-
self._post_partial_message(final_message,
|
|
398
|
-
state.latest_partial = None
|
|
399
|
-
state.final_sent = True
|
|
400
|
-
partial_parts.clear()
|
|
401
|
-
self._stream_state = None
|
|
402
|
-
break
|
|
403
|
-
|
|
404
|
-
# Ignore other AgentStreamEvent variants (e.g. tool call notifications) for partial UI updates.
|
|
419
|
+
self._post_partial_message(final_message, False)
|
|
405
420
|
|
|
406
421
|
except Exception: # pragma: no cover - defensive logging
|
|
407
422
|
logger.exception(
|
|
@@ -13,8 +13,9 @@ logger = get_logger(__name__)
|
|
|
13
13
|
async def ask_user(ctx: RunContext[AgentDeps], question: str) -> str:
|
|
14
14
|
"""Ask the human a question and return the answer.
|
|
15
15
|
|
|
16
|
+
|
|
16
17
|
Args:
|
|
17
|
-
question: The question to ask the user
|
|
18
|
+
question: The question to ask the user with a clear CTA at the end. Needs to be is readable, clear, and easy to understand. Use Markdown formatting. Make key phrases and words stand out.
|
|
18
19
|
|
|
19
20
|
Returns:
|
|
20
21
|
The user's response as a string
|
shotgun/codebase/core/manager.py
CHANGED
|
@@ -27,6 +27,14 @@ from shotgun.logging_config import get_logger
|
|
|
27
27
|
logger = get_logger(__name__)
|
|
28
28
|
|
|
29
29
|
|
|
30
|
+
class CodebaseAlreadyIndexedError(Exception):
|
|
31
|
+
"""Raised when a codebase is already indexed."""
|
|
32
|
+
|
|
33
|
+
def __init__(self, repo_path: str):
|
|
34
|
+
self.repo_path = repo_path
|
|
35
|
+
super().__init__(f"Codebase already indexed: {repo_path}")
|
|
36
|
+
|
|
37
|
+
|
|
30
38
|
class CodebaseFileHandler(FileSystemEventHandler):
|
|
31
39
|
"""Handles file system events for code graph updates."""
|
|
32
40
|
|
|
@@ -339,9 +347,7 @@ class CodebaseGraphManager:
|
|
|
339
347
|
|
|
340
348
|
# Check if graph already exists
|
|
341
349
|
if graph_path.exists():
|
|
342
|
-
raise
|
|
343
|
-
f"Graph already exists for {repo_path}. Use update_graph() to modify it."
|
|
344
|
-
)
|
|
350
|
+
raise CodebaseAlreadyIndexedError(repo_path)
|
|
345
351
|
|
|
346
352
|
# Import the builder from local core module
|
|
347
353
|
from shotgun.codebase.core import CodebaseIngestor
|
|
@@ -23,7 +23,7 @@ Use meaningful artifact IDs like: "api-design-patterns", "microservices-study",
|
|
|
23
23
|
## RESEARCH PRINCIPLES
|
|
24
24
|
|
|
25
25
|
{% if interactive_mode -%}
|
|
26
|
-
- CRITICAL: BEFORE RUNNING ANY SEARCH TOOL, ASK THE USER FOR
|
|
26
|
+
- CRITICAL: BEFORE RUNNING ANY SEARCH TOOL, ASK THE USER FOR APPROVAL USING ask_user(). FINISH THE QUESTION WITH ASKING FOR A GO AHEAD.
|
|
27
27
|
{% endif -%}
|
|
28
28
|
- Build upon existing research rather than starting from scratch
|
|
29
29
|
- Focus on practical, actionable information over theoretical concepts
|
shotgun/tui/screens/chat.py
CHANGED
|
@@ -33,6 +33,7 @@ from shotgun.agents.models import (
|
|
|
33
33
|
UserAnswer,
|
|
34
34
|
UserQuestion,
|
|
35
35
|
)
|
|
36
|
+
from shotgun.codebase.core.manager import CodebaseAlreadyIndexedError
|
|
36
37
|
from shotgun.sdk.codebase import CodebaseSDK
|
|
37
38
|
from shotgun.sdk.exceptions import CodebaseNotFoundError, InvalidPathError
|
|
38
39
|
from shotgun.sdk.services import get_artifact_service, get_codebase_service
|
|
@@ -248,6 +249,12 @@ class CodebaseIndexScreen(ModalScreen[CodebaseIndexSelection | None]):
|
|
|
248
249
|
disabled=True,
|
|
249
250
|
)
|
|
250
251
|
|
|
252
|
+
def on_mount(self) -> None:
|
|
253
|
+
name_input = self.query_one("#index-codebase-name", Input)
|
|
254
|
+
if not name_input.value and self.selected_path:
|
|
255
|
+
name_input.value = self.selected_path.name
|
|
256
|
+
self._update_confirm()
|
|
257
|
+
|
|
251
258
|
def _update_confirm(self) -> None:
|
|
252
259
|
confirm = self.query_one("#index-confirm", Button)
|
|
253
260
|
name_input = self.query_one("#index-codebase-name", Input)
|
|
@@ -475,9 +482,14 @@ class ChatScreen(Screen[None]):
|
|
|
475
482
|
if event.is_last:
|
|
476
483
|
partial_response_widget.partial_response = None
|
|
477
484
|
|
|
485
|
+
def _clear_partial_response(self) -> None:
|
|
486
|
+
partial_response_widget = self.query_one(ChatHistory)
|
|
487
|
+
partial_response_widget.partial_response = None
|
|
488
|
+
|
|
478
489
|
@on(MessageHistoryUpdated)
|
|
479
490
|
def handle_message_history_updated(self, event: MessageHistoryUpdated) -> None:
|
|
480
491
|
"""Handle message history updates from the agent manager."""
|
|
492
|
+
self._clear_partial_response()
|
|
481
493
|
self.messages = event.messages
|
|
482
494
|
|
|
483
495
|
# If there are file operations, add a message showing the modified files
|
|
@@ -611,6 +623,11 @@ class ChatScreen(Screen[None]):
|
|
|
611
623
|
severity="information",
|
|
612
624
|
timeout=8,
|
|
613
625
|
)
|
|
626
|
+
|
|
627
|
+
self.mount_hint(codebase_indexed_hint(selection.name))
|
|
628
|
+
except CodebaseAlreadyIndexedError as exc:
|
|
629
|
+
self.notify(str(exc), severity="warning")
|
|
630
|
+
return
|
|
614
631
|
except InvalidPathError as exc:
|
|
615
632
|
self.notify(str(exc), severity="error")
|
|
616
633
|
|
|
@@ -619,7 +636,6 @@ class ChatScreen(Screen[None]):
|
|
|
619
636
|
finally:
|
|
620
637
|
label.update("")
|
|
621
638
|
label.refresh()
|
|
622
|
-
self.mount_hint(codebase_indexed_hint(selection.name))
|
|
623
639
|
|
|
624
640
|
@work
|
|
625
641
|
async def run_agent(self, message: str) -> None:
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import json
|
|
2
|
+
from collections.abc import Sequence
|
|
2
3
|
|
|
3
4
|
from pydantic_ai.messages import (
|
|
4
5
|
BuiltinToolCallPart,
|
|
5
6
|
BuiltinToolReturnPart,
|
|
6
7
|
ModelMessage,
|
|
7
8
|
ModelRequest,
|
|
9
|
+
ModelRequestPart,
|
|
8
10
|
ModelResponse,
|
|
9
11
|
TextPart,
|
|
10
12
|
ThinkingPart,
|
|
11
13
|
ToolCallPart,
|
|
14
|
+
ToolReturnPart,
|
|
12
15
|
)
|
|
13
16
|
from textual.app import ComposeResult
|
|
14
17
|
from textual.reactive import reactive
|
|
@@ -78,27 +81,32 @@ class ChatHistory(Widget):
|
|
|
78
81
|
|
|
79
82
|
def compose(self) -> ComposeResult:
|
|
80
83
|
self.vertical_tail = VerticalTail()
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
84
|
+
with self.vertical_tail:
|
|
85
|
+
for item in self.items:
|
|
86
|
+
if isinstance(item, ModelRequest):
|
|
87
|
+
yield UserQuestionWidget(item)
|
|
88
|
+
elif isinstance(item, ModelResponse):
|
|
89
|
+
yield AgentResponseWidget(item)
|
|
90
|
+
yield PartialResponseWidget(self.partial_response).data_bind(
|
|
91
|
+
item=ChatHistory.partial_response
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
def watch_partial_response(self, _partial_response: ModelMessage | None) -> None:
|
|
95
|
+
self.call_after_refresh(self.autoscroll)
|
|
85
96
|
|
|
86
97
|
def update_messages(self, messages: list[ModelMessage]) -> None:
|
|
87
98
|
"""Update the displayed messages without recomposing."""
|
|
88
99
|
if not self.vertical_tail:
|
|
89
100
|
return
|
|
90
101
|
|
|
91
|
-
|
|
92
|
-
self.
|
|
102
|
+
self.items = messages
|
|
103
|
+
self.refresh(recompose=True)
|
|
93
104
|
|
|
94
|
-
|
|
95
|
-
for item in messages:
|
|
96
|
-
if isinstance(item, ModelRequest):
|
|
97
|
-
self.vertical_tail.mount(UserQuestionWidget(item))
|
|
98
|
-
elif isinstance(item, ModelResponse):
|
|
99
|
-
self.vertical_tail.mount(AgentResponseWidget(item))
|
|
105
|
+
self.autoscroll()
|
|
100
106
|
|
|
101
|
-
|
|
107
|
+
def autoscroll(self) -> None:
|
|
108
|
+
if self.vertical_tail:
|
|
109
|
+
self.vertical_tail.scroll_end(animate=False)
|
|
102
110
|
|
|
103
111
|
|
|
104
112
|
class UserQuestionWidget(Widget):
|
|
@@ -116,6 +124,20 @@ class UserQuestionWidget(Widget):
|
|
|
116
124
|
)
|
|
117
125
|
yield Markdown(markdown=f"**>** {prompt}")
|
|
118
126
|
|
|
127
|
+
def format_prompt_parts(self, parts: Sequence[ModelRequestPart]) -> str:
|
|
128
|
+
acc = ""
|
|
129
|
+
for part in parts:
|
|
130
|
+
if isinstance(part, TextPart):
|
|
131
|
+
acc += (
|
|
132
|
+
f"**>** {part.content if isinstance(part.content, str) else ''}\n\n"
|
|
133
|
+
)
|
|
134
|
+
elif isinstance(part, ToolCallPart):
|
|
135
|
+
if part.tool_name == "ask_user" and isinstance(part.content, dict):
|
|
136
|
+
acc += f"**>** {part.content['answer']}\n\n"
|
|
137
|
+
else:
|
|
138
|
+
acc += "∟ finished\n\n" # let's not show anything yet
|
|
139
|
+
return acc
|
|
140
|
+
|
|
119
141
|
|
|
120
142
|
class AgentResponseWidget(Widget):
|
|
121
143
|
def __init__(self, item: ModelResponse | None) -> None:
|
|
@@ -133,34 +155,38 @@ class AgentResponseWidget(Widget):
|
|
|
133
155
|
acc = ""
|
|
134
156
|
if self.item is None:
|
|
135
157
|
return ""
|
|
136
|
-
for part in self.item.parts:
|
|
158
|
+
for idx, part in enumerate(self.item.parts):
|
|
137
159
|
if isinstance(part, TextPart):
|
|
138
160
|
acc += part.content + "\n\n"
|
|
139
161
|
elif isinstance(part, ToolCallPart):
|
|
140
162
|
parts_str = self._format_tool_call_part(part)
|
|
141
163
|
acc += parts_str + "\n\n"
|
|
164
|
+
elif isinstance(part, ToolReturnPart):
|
|
165
|
+
acc += (
|
|
166
|
+
f"tool ({part.tool_name}) return: "
|
|
167
|
+
+ self._format_tool_return_call_part(part)
|
|
168
|
+
+ "\n\n"
|
|
169
|
+
)
|
|
142
170
|
elif isinstance(part, BuiltinToolCallPart):
|
|
143
|
-
acc += f"{part.tool_name}
|
|
171
|
+
acc += f"builtin tool ({part.tool_name}): {part.args}\n\n"
|
|
144
172
|
elif isinstance(part, BuiltinToolReturnPart):
|
|
145
|
-
acc += f"{part.tool_name}
|
|
173
|
+
acc += f"builtin tool ({part.tool_name}) return: {part.content}\n\n"
|
|
146
174
|
elif isinstance(part, ThinkingPart):
|
|
147
|
-
|
|
175
|
+
if (
|
|
176
|
+
idx == len(self.item.parts) - 1
|
|
177
|
+
): # show the thinking part only if it's the last part
|
|
178
|
+
acc += (
|
|
179
|
+
f"thinking: {part.content}\n\n"
|
|
180
|
+
if part.content
|
|
181
|
+
else "Thinking..."
|
|
182
|
+
)
|
|
183
|
+
else:
|
|
184
|
+
continue
|
|
148
185
|
return acc.strip()
|
|
149
186
|
|
|
150
187
|
def _format_tool_call_part(self, part: ToolCallPart) -> str:
|
|
151
188
|
if part.tool_name == "ask_user":
|
|
152
|
-
|
|
153
|
-
try:
|
|
154
|
-
_args = json.loads(part.args) if part.args.strip() else {}
|
|
155
|
-
except json.JSONDecodeError:
|
|
156
|
-
_args = {}
|
|
157
|
-
else:
|
|
158
|
-
_args = part.args
|
|
159
|
-
|
|
160
|
-
if isinstance(_args, dict) and "question" in _args:
|
|
161
|
-
return f"{_args['question']}"
|
|
162
|
-
else:
|
|
163
|
-
return "❓ "
|
|
189
|
+
return self._format_ask_user_part(part)
|
|
164
190
|
if part.tool_name == "write_artifact_section":
|
|
165
191
|
if isinstance(part.args, dict) and "section_title" in part.args:
|
|
166
192
|
return f"{part.tool_name}({part.args['section_title']})"
|
|
@@ -170,6 +196,31 @@ class AgentResponseWidget(Widget):
|
|
|
170
196
|
if isinstance(part.args, dict) and "name" in part.args:
|
|
171
197
|
return f"{part.tool_name}({part.args['name']})"
|
|
172
198
|
else:
|
|
173
|
-
return f"{part.tool_name}()"
|
|
199
|
+
return f"▪ {part.tool_name}()"
|
|
174
200
|
|
|
175
201
|
return f"{part.tool_name}({part.args})"
|
|
202
|
+
|
|
203
|
+
def _format_ask_user_part(
|
|
204
|
+
self,
|
|
205
|
+
part: ToolCallPart,
|
|
206
|
+
) -> str:
|
|
207
|
+
return "*Answer to continue*"
|
|
208
|
+
if isinstance(part.args, str):
|
|
209
|
+
try:
|
|
210
|
+
_args = json.loads(part.args) if part.args.strip() else {}
|
|
211
|
+
except json.JSONDecodeError:
|
|
212
|
+
_args = {}
|
|
213
|
+
else:
|
|
214
|
+
_args = part.args
|
|
215
|
+
|
|
216
|
+
if isinstance(_args, dict) and "question" in _args:
|
|
217
|
+
return f"{_args['question']}"
|
|
218
|
+
else:
|
|
219
|
+
return "❓ "
|
|
220
|
+
|
|
221
|
+
def _format_tool_return_call_part(self, part: ToolReturnPart) -> str:
|
|
222
|
+
content = part.content
|
|
223
|
+
if part.tool_name == "ask_user":
|
|
224
|
+
response = content.get("answer", "") if isinstance(content, dict) else ""
|
|
225
|
+
return f"**⏺** {response}"
|
|
226
|
+
return f"∟ {content}"
|
|
@@ -7,7 +7,7 @@ shotgun/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
7
7
|
shotgun/sentry_telemetry.py,sha256=3r9on0GQposn9aX6Dkb9mrfaVQl_dIZzhu9BjE838AU,2854
|
|
8
8
|
shotgun/telemetry.py,sha256=aBwCRFU97oiIK5K13OhT7yYCQUAVQyrvnoG-aX3k2ZE,3109
|
|
9
9
|
shotgun/agents/__init__.py,sha256=8Jzv1YsDuLyNPFJyckSr_qI4ehTVeDyIMDW4omsfPGc,25
|
|
10
|
-
shotgun/agents/agent_manager.py,sha256=
|
|
10
|
+
shotgun/agents/agent_manager.py,sha256=N9BUoGCydfiHVxLImG4JraSO4niQJqJPcj82M0ATT6g,16828
|
|
11
11
|
shotgun/agents/artifact_state.py,sha256=WkspYQe-9CvBS90PapBsX997yvJ5KWH-qtSXIWmfvp0,2121
|
|
12
12
|
shotgun/agents/common.py,sha256=my-Y7VNNpDDYxDJ4hlRmTs7lIS8tBKFvR9ew7uKxcPE,11369
|
|
13
13
|
shotgun/agents/models.py,sha256=6edILmN7caDAmf8x-qgl7lA42tl2b-ZsiC3da8tS3Xw,7127
|
|
@@ -32,7 +32,7 @@ shotgun/agents/history/token_estimation.py,sha256=iNqhDSqFzG0YYxGijMRzj54GALFglO
|
|
|
32
32
|
shotgun/agents/tools/__init__.py,sha256=QaN80IqWvB5qEcjHqri1-PYvYlO74vdhcwLugoEdblo,772
|
|
33
33
|
shotgun/agents/tools/artifact_management.py,sha256=f8WvCCcXb_sMK0U4Y8D1RLUhcj2rhT6CrxB3bURYxcs,17205
|
|
34
34
|
shotgun/agents/tools/file_management.py,sha256=6ru6DXAl-S6DiCt2HLGTDrK2rJBJpn-t6RkSHzYbxc4,4571
|
|
35
|
-
shotgun/agents/tools/user_interaction.py,sha256=
|
|
35
|
+
shotgun/agents/tools/user_interaction.py,sha256=b3ncEpvoD06Cz4hwsS-ppVbQajQj640iWnVfA5WBjAA,1236
|
|
36
36
|
shotgun/agents/tools/codebase/__init__.py,sha256=ceAGkK006NeOYaIJBLQsw7Q46sAyCRK9PYDs8feMQVw,661
|
|
37
37
|
shotgun/agents/tools/codebase/codebase_shell.py,sha256=2zEq8YXzdcYttYAfKso_JGRqXHyy3xgAuWlf0unopFg,8635
|
|
38
38
|
shotgun/agents/tools/codebase/directory_lister.py,sha256=MCLGDEc0F-4J8-UrquxdJrIQYs5xzYgws65mjf7Q7X4,4724
|
|
@@ -79,14 +79,14 @@ shotgun/codebase/core/change_detector.py,sha256=kWCYLWzRzb3IGGOj71KBn7UOCOKMpINJ
|
|
|
79
79
|
shotgun/codebase/core/code_retrieval.py,sha256=_JVyyQKHDFm3dxOOua1mw9eIIOHIVz3-I8aZtEsEj1E,7927
|
|
80
80
|
shotgun/codebase/core/ingestor.py,sha256=zMjadeqDOEr2v3vhTS25Jvx0WsLPXpgwquZfbdiz57o,59810
|
|
81
81
|
shotgun/codebase/core/language_config.py,sha256=vsqHyuFnumRPRBV1lMOxWKNOIiClO6FyfKQR0fGrtl4,8934
|
|
82
|
-
shotgun/codebase/core/manager.py,sha256=
|
|
82
|
+
shotgun/codebase/core/manager.py,sha256=GpLeyxC25HJKxh3wQxTiTkXv9NUDQdH6Mi9IdaMUmVQ,55586
|
|
83
83
|
shotgun/codebase/core/nl_query.py,sha256=iV6NbsyDd1SQpT9U9BtgxcZPsNoEW3OHrkk475r_jAY,11410
|
|
84
84
|
shotgun/codebase/core/parser_loader.py,sha256=LZRrDS8Sp518jIu3tQW-BxdwJ86lnsTteI478ER9Td8,4278
|
|
85
85
|
shotgun/prompts/__init__.py,sha256=RswUm0HMdfm2m2YKUwUsEdRIwoczdbI7zlucoEvHYRo,132
|
|
86
86
|
shotgun/prompts/loader.py,sha256=jy24-E02pCSmz2651aCT2NgHfRrHAGMYvKrD6gs0Er8,4424
|
|
87
87
|
shotgun/prompts/agents/__init__.py,sha256=YRIJMbzpArojNX1BP5gfxxois334z_GQga8T-xyWMbY,39
|
|
88
88
|
shotgun/prompts/agents/plan.j2,sha256=mogmrjqLx5xSXYqWdvLqcObZSfLVLQI39JpVs3Z-V84,2494
|
|
89
|
-
shotgun/prompts/agents/research.j2,sha256=
|
|
89
|
+
shotgun/prompts/agents/research.j2,sha256=cLwPdIvv1MvVaHZYLdBhON-8qk-c3kjrRTF1-7Bc-vI,3069
|
|
90
90
|
shotgun/prompts/agents/specify.j2,sha256=1CC2SHsxA1Yma0gSFsq-k3VpwtEohN9nh2qeRMMRPRA,1809
|
|
91
91
|
shotgun/prompts/agents/tasks.j2,sha256=OYW1zsYRJxoQF4yVMqJNgi4SNz3YmcP4sljHmmqAu4Q,3613
|
|
92
92
|
shotgun/prompts/agents/partials/artifact_system.j2,sha256=kaqkMU-t2x3M7z-4HU4KffSFug1WM5VDsin6tCkxjHg,1528
|
|
@@ -123,20 +123,20 @@ shotgun/tui/components/prompt_input.py,sha256=Ss-htqraHZAPaehGE4x86ij0veMjc4Ugad
|
|
|
123
123
|
shotgun/tui/components/spinner.py,sha256=ovTDeaJ6FD6chZx_Aepia6R3UkPOVJ77EKHfRmn39MY,2427
|
|
124
124
|
shotgun/tui/components/splash.py,sha256=vppy9vEIEvywuUKRXn2y11HwXSRkQZHLYoVjhDVdJeU,1267
|
|
125
125
|
shotgun/tui/components/vertical_tail.py,sha256=kkCH0WjAh54jDvRzIaOffRZXUKn_zHFZ_ichfUpgzaE,1071
|
|
126
|
-
shotgun/tui/screens/chat.py,sha256=
|
|
126
|
+
shotgun/tui/screens/chat.py,sha256=2jtjRBU6r-V5frEud-NqIYLHTi0C5HX6uLAXOwYuUo8,24564
|
|
127
127
|
shotgun/tui/screens/chat.tcss,sha256=2Yq3E23jxsySYsgZf4G1AYrYVcpX0UDW6kNNI0tDmtM,437
|
|
128
128
|
shotgun/tui/screens/directory_setup.py,sha256=lIZ1J4A6g5Q2ZBX8epW7BhR96Dmdcg22CyiM5S-I5WU,3237
|
|
129
129
|
shotgun/tui/screens/provider_config.py,sha256=A_tvDHF5KLP5PV60LjMJ_aoOdT3TjI6_g04UIUqGPqM,7126
|
|
130
130
|
shotgun/tui/screens/splash.py,sha256=E2MsJihi3c9NY1L28o_MstDxGwrCnnV7zdq00MrGAsw,706
|
|
131
131
|
shotgun/tui/screens/chat_screen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
132
132
|
shotgun/tui/screens/chat_screen/command_providers.py,sha256=4Q8jR7wN4e2q0SWHSsISZP-POyu1B9lyXgoOTKB4ZLc,7198
|
|
133
|
-
shotgun/tui/screens/chat_screen/history.py,sha256=
|
|
133
|
+
shotgun/tui/screens/chat_screen/history.py,sha256=0rSb512ZhkF8zzqkWfwHp-Cmu5VIqL-LzPkohwlHe4Q,7447
|
|
134
134
|
shotgun/utils/__init__.py,sha256=WinIEp9oL2iMrWaDkXz2QX4nYVPAm8C9aBSKTeEwLtE,198
|
|
135
135
|
shotgun/utils/env_utils.py,sha256=8QK5aw_f_V2AVTleQQlcL0RnD4sPJWXlDG46fsHu0d8,1057
|
|
136
136
|
shotgun/utils/file_system_utils.py,sha256=l-0p1bEHF34OU19MahnRFdClHufThfGAjQ431teAIp0,1004
|
|
137
137
|
shotgun/utils/update_checker.py,sha256=Xf-7w3Pos3etzCoT771gJe2HLkA8_V2GrqWy7ni9UqA,11373
|
|
138
|
-
shotgun_sh-0.1.0.
|
|
139
|
-
shotgun_sh-0.1.0.
|
|
140
|
-
shotgun_sh-0.1.0.
|
|
141
|
-
shotgun_sh-0.1.0.
|
|
142
|
-
shotgun_sh-0.1.0.
|
|
138
|
+
shotgun_sh-0.1.0.dev18.dist-info/METADATA,sha256=woXTk-ZMmEwPuNJXm-LS5ZG0DPFM8ZH39VLVWEhdvZU,11271
|
|
139
|
+
shotgun_sh-0.1.0.dev18.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
140
|
+
shotgun_sh-0.1.0.dev18.dist-info/entry_points.txt,sha256=asZxLU4QILneq0MWW10saVCZc4VWhZfb0wFZvERnzfA,45
|
|
141
|
+
shotgun_sh-0.1.0.dev18.dist-info/licenses/LICENSE,sha256=YebsZl590zCHrF_acCU5pmNt0pnAfD2DmAnevJPB1tY,1065
|
|
142
|
+
shotgun_sh-0.1.0.dev18.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|