shotgun-sh 0.1.0.dev15__py3-none-any.whl → 0.1.0.dev17__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.

@@ -29,4 +29,15 @@ ModeIndicator {
29
29
 
30
30
  .hidden {
31
31
  display: none;
32
+ }
33
+
34
+ #footer > Grid {
35
+ height: auto;
36
+ grid-columns: 1fr auto;
37
+ grid-size: 2;
38
+ }
39
+
40
+
41
+ #indexing-job-display {
42
+ text-align: end;
32
43
  }
File without changes
@@ -0,0 +1,203 @@
1
+ from collections.abc import AsyncGenerator
2
+ from typing import TYPE_CHECKING, cast
3
+
4
+ from textual.command import DiscoveryHit, Hit, Provider
5
+
6
+ from shotgun.agents.agent_manager import AgentType
7
+ from shotgun.codebase.models import CodebaseGraph
8
+
9
+ if TYPE_CHECKING:
10
+ from shotgun.tui.screens.chat import ChatScreen
11
+
12
+
13
+ class AgentModeProvider(Provider):
14
+ """Command provider for agent mode switching."""
15
+
16
+ @property
17
+ def chat_screen(self) -> "ChatScreen":
18
+ from shotgun.tui.screens.chat import ChatScreen
19
+
20
+ return cast(ChatScreen, self.screen)
21
+
22
+ def set_mode(self, mode: AgentType) -> None:
23
+ """Switch to research mode."""
24
+ self.chat_screen.mode = mode
25
+
26
+ async def discover(self) -> AsyncGenerator[DiscoveryHit, None]:
27
+ """Provide default mode switching commands when palette opens."""
28
+ yield DiscoveryHit(
29
+ "Switch to Research Mode",
30
+ lambda: self.set_mode(AgentType.RESEARCH),
31
+ help="🔬 Research topics with web search and synthesize findings",
32
+ )
33
+ yield DiscoveryHit(
34
+ "Switch to Plan Mode",
35
+ lambda: self.set_mode(AgentType.PLAN),
36
+ help="📋 Create comprehensive, actionable plans with milestones",
37
+ )
38
+ yield DiscoveryHit(
39
+ "Switch to Tasks Mode",
40
+ lambda: self.set_mode(AgentType.TASKS),
41
+ help="✅ Generate specific, actionable tasks from research and plans",
42
+ )
43
+
44
+ async def search(self, query: str) -> AsyncGenerator[Hit, None]:
45
+ """Search for mode commands."""
46
+ matcher = self.matcher(query)
47
+
48
+ commands = [
49
+ (
50
+ "Switch to Research Mode",
51
+ "🔬 Research topics with web search and synthesize findings",
52
+ lambda: self.set_mode(AgentType.RESEARCH),
53
+ AgentType.RESEARCH,
54
+ ),
55
+ (
56
+ "Switch to Specify Mode",
57
+ "📝 Create detailed specifications and requirements documents",
58
+ lambda: self.set_mode(AgentType.SPECIFY),
59
+ AgentType.SPECIFY,
60
+ ),
61
+ (
62
+ "Switch to Plan Mode",
63
+ "📋 Create comprehensive, actionable plans with milestones",
64
+ lambda: self.set_mode(AgentType.PLAN),
65
+ AgentType.PLAN,
66
+ ),
67
+ (
68
+ "Switch to Tasks Mode",
69
+ "✅ Generate specific, actionable tasks from research and plans",
70
+ lambda: self.set_mode(AgentType.TASKS),
71
+ AgentType.TASKS,
72
+ ),
73
+ ]
74
+
75
+ for title, help_text, callback, mode in commands:
76
+ if self.chat_screen.mode == mode:
77
+ continue
78
+ score = matcher.match(title)
79
+ if score > 0:
80
+ yield Hit(score, matcher.highlight(title), callback, help=help_text)
81
+
82
+
83
+ class ProviderSetupProvider(Provider):
84
+ """Command palette entries for provider configuration."""
85
+
86
+ @property
87
+ def chat_screen(self) -> "ChatScreen":
88
+ from shotgun.tui.screens.chat import ChatScreen
89
+
90
+ return cast(ChatScreen, self.screen)
91
+
92
+ def open_provider_config(self) -> None:
93
+ """Show the provider configuration screen."""
94
+ self.chat_screen.app.push_screen("provider_config")
95
+
96
+ async def discover(self) -> AsyncGenerator[DiscoveryHit, None]:
97
+ yield DiscoveryHit(
98
+ "Open Provider Setup",
99
+ self.open_provider_config,
100
+ help="⚙️ Manage API keys for available providers",
101
+ )
102
+
103
+ async def search(self, query: str) -> AsyncGenerator[Hit, None]:
104
+ matcher = self.matcher(query)
105
+ title = "Open Provider Setup"
106
+ score = matcher.match(title)
107
+ if score > 0:
108
+ yield Hit(
109
+ score,
110
+ matcher.highlight(title),
111
+ self.open_provider_config,
112
+ help="⚙️ Manage API keys for available providers",
113
+ )
114
+
115
+
116
+ class CodebaseCommandProvider(Provider):
117
+ """Command palette entries for codebase management."""
118
+
119
+ @property
120
+ def chat_screen(self) -> "ChatScreen":
121
+ from shotgun.tui.screens.chat import ChatScreen
122
+
123
+ return cast(ChatScreen, self.screen)
124
+
125
+ async def discover(self) -> AsyncGenerator[DiscoveryHit, None]:
126
+ yield DiscoveryHit(
127
+ "Codebase: Index Codebase",
128
+ self.chat_screen.index_codebase_command,
129
+ help="Index a repository into the codebase graph",
130
+ )
131
+ yield DiscoveryHit(
132
+ "Codebase: Delete Codebase Index",
133
+ self.chat_screen.delete_codebase_command,
134
+ help="Delete an existing codebase index",
135
+ )
136
+
137
+ async def search(self, query: str) -> AsyncGenerator[Hit, None]:
138
+ matcher = self.matcher(query)
139
+ commands = [
140
+ (
141
+ "Codebase: Index Codebase",
142
+ self.chat_screen.index_codebase_command,
143
+ "Index a repository into the codebase graph",
144
+ ),
145
+ (
146
+ "Codebase: Delete Codebase Index",
147
+ self.chat_screen.delete_codebase_command,
148
+ "Delete an existing codebase index",
149
+ ),
150
+ ]
151
+ for title, callback, help_text in commands:
152
+ score = matcher.match(title)
153
+ if score > 0:
154
+ yield Hit(score, matcher.highlight(title), callback, help=help_text)
155
+
156
+
157
+ class DeleteCodebasePaletteProvider(Provider):
158
+ """Provider that lists indexed codebases for deletion."""
159
+
160
+ @property
161
+ def chat_screen(self) -> "ChatScreen":
162
+ from shotgun.tui.screens.chat import ChatScreen
163
+
164
+ return cast(ChatScreen, self.screen)
165
+
166
+ async def _codebases(self) -> list[CodebaseGraph]:
167
+ try:
168
+ result = await self.chat_screen.codebase_sdk.list_codebases()
169
+ except Exception as exc: # pragma: no cover - defensive UI path
170
+ self.chat_screen.notify(
171
+ f"Unable to load codebases: {exc}", severity="error"
172
+ )
173
+ return []
174
+ return result.graphs
175
+
176
+ async def discover(self) -> AsyncGenerator[DiscoveryHit, None]:
177
+ graphs = await self._codebases()
178
+ for graph in graphs:
179
+ title = f"Delete {graph.name}"
180
+ help_text = f"{graph.graph_id} • {graph.repo_path}"
181
+ yield DiscoveryHit(
182
+ title,
183
+ lambda graph_id=graph.graph_id: self.chat_screen.delete_codebase_from_palette(
184
+ graph_id
185
+ ),
186
+ help=help_text,
187
+ )
188
+
189
+ async def search(self, query: str) -> AsyncGenerator[Hit, None]:
190
+ matcher = self.matcher(query)
191
+ graphs = await self._codebases()
192
+ for graph in graphs:
193
+ display = f"{graph.name} ({graph.graph_id[:8]})"
194
+ score = matcher.match(display)
195
+ if score > 0:
196
+ yield Hit(
197
+ score,
198
+ matcher.highlight(display),
199
+ lambda graph_id=graph.graph_id: self.chat_screen.delete_codebase_from_palette(
200
+ graph_id
201
+ ),
202
+ help=graph.repo_path,
203
+ )
@@ -0,0 +1,175 @@
1
+ import json
2
+
3
+ from pydantic_ai.messages import (
4
+ BuiltinToolCallPart,
5
+ BuiltinToolReturnPart,
6
+ ModelMessage,
7
+ ModelRequest,
8
+ ModelResponse,
9
+ TextPart,
10
+ ThinkingPart,
11
+ ToolCallPart,
12
+ )
13
+ from textual.app import ComposeResult
14
+ from textual.reactive import reactive
15
+ from textual.widget import Widget
16
+ from textual.widgets import Markdown
17
+
18
+ from shotgun.tui.components.vertical_tail import VerticalTail
19
+
20
+
21
+ class PartialResponseWidget(Widget): # TODO: doesn't work lol
22
+ DEFAULT_CSS = """
23
+ PartialResponseWidget {
24
+ height: auto;
25
+ }
26
+ Markdown, AgentResponseWidget, UserQuestionWidget {
27
+ height: auto;
28
+ }
29
+ """
30
+
31
+ item: reactive[ModelMessage | None] = reactive(None, recompose=True)
32
+
33
+ def __init__(self, item: ModelMessage | None) -> None:
34
+ super().__init__()
35
+ self.item = item
36
+
37
+ def compose(self) -> ComposeResult:
38
+ if self.item is None:
39
+ pass
40
+ elif self.item.kind == "response":
41
+ yield AgentResponseWidget(self.item)
42
+ elif self.item.kind == "request":
43
+ yield UserQuestionWidget(self.item)
44
+
45
+ def watch_item(self, item: ModelMessage | None) -> None:
46
+ if item is None:
47
+ self.display = False
48
+ else:
49
+ self.display = True
50
+
51
+
52
+ class ChatHistory(Widget):
53
+ DEFAULT_CSS = """
54
+ VerticalTail {
55
+ align: left bottom;
56
+
57
+ }
58
+ VerticalTail > * {
59
+ height: auto;
60
+ }
61
+
62
+ Horizontal {
63
+ height: auto;
64
+ background: $secondary-muted;
65
+ }
66
+
67
+ Markdown {
68
+ height: auto;
69
+ }
70
+ """
71
+ partial_response: reactive[ModelMessage | None] = reactive(None)
72
+
73
+ def __init__(self) -> None:
74
+ super().__init__()
75
+ self.items: list[ModelMessage] = []
76
+ self.vertical_tail: VerticalTail | None = None
77
+ self.partial_response = None
78
+
79
+ def compose(self) -> ComposeResult:
80
+ self.vertical_tail = VerticalTail()
81
+ yield self.vertical_tail
82
+ yield PartialResponseWidget(self.partial_response).data_bind(
83
+ item=ChatHistory.partial_response
84
+ )
85
+
86
+ def update_messages(self, messages: list[ModelMessage]) -> None:
87
+ """Update the displayed messages without recomposing."""
88
+ if not self.vertical_tail:
89
+ return
90
+
91
+ # Clear existing widgets
92
+ self.vertical_tail.remove_children()
93
+
94
+ # Add new message widgets
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))
100
+
101
+ self.items = messages
102
+
103
+
104
+ class UserQuestionWidget(Widget):
105
+ def __init__(self, item: ModelRequest | None) -> None:
106
+ super().__init__()
107
+ self.item = item
108
+
109
+ def compose(self) -> ComposeResult:
110
+ self.display = self.item is not None
111
+ if self.item is None:
112
+ yield Markdown(markdown="")
113
+ else:
114
+ prompt = "".join(
115
+ str(part.content) for part in self.item.parts if part.content
116
+ )
117
+ yield Markdown(markdown=f"**>** {prompt}")
118
+
119
+
120
+ class AgentResponseWidget(Widget):
121
+ def __init__(self, item: ModelResponse | None) -> None:
122
+ super().__init__()
123
+ self.item = item
124
+
125
+ def compose(self) -> ComposeResult:
126
+ self.display = self.item is not None
127
+ if self.item is None:
128
+ yield Markdown(markdown="")
129
+ else:
130
+ yield Markdown(markdown=f"**⏺** {self.compute_output()}")
131
+
132
+ def compute_output(self) -> str:
133
+ acc = ""
134
+ if self.item is None:
135
+ return ""
136
+ for part in self.item.parts: # TextPart | ToolCallPart | BuiltinToolCallPart | BuiltinToolReturnPart | ThinkingPart
137
+ if isinstance(part, TextPart):
138
+ acc += part.content + "\n\n"
139
+ elif isinstance(part, ToolCallPart):
140
+ parts_str = self._format_tool_call_part(part)
141
+ acc += parts_str + "\n\n"
142
+ elif isinstance(part, BuiltinToolCallPart):
143
+ acc += f"{part.tool_name}({part.args})\n\n"
144
+ elif isinstance(part, BuiltinToolReturnPart):
145
+ acc += f"{part.tool_name}()\n\n"
146
+ elif isinstance(part, ThinkingPart):
147
+ acc += f"{part.content}\n\n"
148
+ return acc.strip()
149
+
150
+ def _format_tool_call_part(self, part: ToolCallPart) -> str:
151
+ if part.tool_name == "ask_user":
152
+ if isinstance(part.args, str):
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 "❓ "
164
+ if part.tool_name == "write_artifact_section":
165
+ if isinstance(part.args, dict) and "section_title" in part.args:
166
+ return f"{part.tool_name}({part.args['section_title']})"
167
+ else:
168
+ return f"{part.tool_name}()"
169
+ if part.tool_name == "create_artifact":
170
+ if isinstance(part.args, dict) and "name" in part.args:
171
+ return f"{part.tool_name}({part.args['name']})"
172
+ else:
173
+ return f"{part.tool_name}()"
174
+
175
+ return f"{part.tool_name}({part.args})"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shotgun-sh
3
- Version: 0.1.0.dev15
3
+ Version: 0.1.0.dev17
4
4
  Summary: AI-powered research, planning, and task management CLI tool
5
5
  Project-URL: Homepage, https://shotgun.sh/
6
6
  Project-URL: Repository, https://github.com/shotgun-sh/shotgun
@@ -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=5jSHlDHO4gZjry9z_9RBuf_Rh_7Uz2sYSyAbQ9s9Tdo,7362
10
+ shotgun/agents/agent_manager.py,sha256=VRMPfwPtgTBtzyp-JYyyitGk_ZQ8oh8hTmB2cEylyZ0,16024
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
@@ -30,7 +30,7 @@ shotgun/agents/history/message_utils.py,sha256=S7wqix4W3uvC8rChs6TMxp7yjnjr8a2Aq
30
30
  shotgun/agents/history/token_counting.py,sha256=RasWy84eNjbmqyQDTGAzj1Q1I9ml_G_9R-maWN7gr8s,13839
31
31
  shotgun/agents/history/token_estimation.py,sha256=iNqhDSqFzG0YYxGijMRzj54GALFglOp0qVMB6G59RhU,4690
32
32
  shotgun/agents/tools/__init__.py,sha256=QaN80IqWvB5qEcjHqri1-PYvYlO74vdhcwLugoEdblo,772
33
- shotgun/agents/tools/artifact_management.py,sha256=Oq5FMguiTQWsJXfoa-0VR-LmUeD8v9yH5p7cKzJOIZA,17240
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
35
  shotgun/agents/tools/user_interaction.py,sha256=7l0OY8EdgO-9gkKy-yOv0V0P_Uzzfk0jMU39d4XN1xM,1087
36
36
  shotgun/agents/tools/codebase/__init__.py,sha256=ceAGkK006NeOYaIJBLQsw7Q46sAyCRK9PYDs8feMQVw,661
@@ -56,7 +56,7 @@ shotgun/artifacts/templates/loader.py,sha256=qLAOibYH55l1kF3Yd3GU5uLVfF0CDUml-vt
56
56
  shotgun/artifacts/templates/models.py,sha256=Y4BhTNhbjZJvBHsf5op569meRq96imggrt5ZjnkeaDg,4879
57
57
  shotgun/artifacts/templates/plan/delivery_and_release_plan.yaml,sha256=HOdOCvVpEu9Qnrf5gll0oqY9v-_vapczyfmaB6c8cAg,3289
58
58
  shotgun/artifacts/templates/research/market_research.yaml,sha256=uoOw5s6kUVwSBhhk6LfcCqZQZUC4BNUQnkeEYEYQ1VE,24744
59
- shotgun/artifacts/templates/research/sdk_comparison.yaml,sha256=UgDGMzYfcmDpY8qaHB2UWpXp-cKcbNQvJfcGopcnzs0,11150
59
+ shotgun/artifacts/templates/research/sdk_comparison.yaml,sha256=grQe52wbGZqdnHx_6gJc88dBdByeWkAtzU3G7HhmyGA,11074
60
60
  shotgun/artifacts/templates/specify/prd.yaml,sha256=LTtTOERjYe1iGV7Wj-WJEExcbHp-zb3LMgweuboXmiM,10784
61
61
  shotgun/artifacts/templates/specify/product_spec.yaml,sha256=BAubivc75VnNZVRqGK9kX1TxZDn-e2_eYbuZGaKvk2U,13953
62
62
  shotgun/cli/__init__.py,sha256=_F1uW2g87y4bGFxz8Gp8u7mq2voHp8vQIUtCmm8Tojo,40
@@ -85,25 +85,25 @@ shotgun/codebase/core/parser_loader.py,sha256=LZRrDS8Sp518jIu3tQW-BxdwJ86lnsTteI
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
- shotgun/prompts/agents/plan.j2,sha256=N6nv3S2up4SPVuB3OZSj7vLqsLfNzynFVjvb9I7Jn3U,2899
89
- shotgun/prompts/agents/research.j2,sha256=YQUlYQX2w4pD8mQ5vOAu7EVrbtZlbGDuwias950JEyc,2997
90
- shotgun/prompts/agents/specify.j2,sha256=vBwMTEDUOCLSJl7J9_oVL5tTk5uFV4LJWlo5Tnw93Zw,1918
91
- shotgun/prompts/agents/tasks.j2,sha256=0gmbZe6J9IyORx8w66Z0cEYrs3TcXO1jSxM1DWd6Fdw,3614
92
- shotgun/prompts/agents/partials/artifact_system.j2,sha256=AD1CvHDSZEmjplmDw443PeOmcXUgM5JdNLu1_mz18kM,1678
88
+ shotgun/prompts/agents/plan.j2,sha256=mogmrjqLx5xSXYqWdvLqcObZSfLVLQI39JpVs3Z-V84,2494
89
+ shotgun/prompts/agents/research.j2,sha256=LxlASYYt45sDmZW8YLJYH8ftGWa6Jvx5aD0MGNXXVjs,3025
90
+ shotgun/prompts/agents/specify.j2,sha256=1CC2SHsxA1Yma0gSFsq-k3VpwtEohN9nh2qeRMMRPRA,1809
91
+ shotgun/prompts/agents/tasks.j2,sha256=OYW1zsYRJxoQF4yVMqJNgi4SNz3YmcP4sljHmmqAu4Q,3613
92
+ shotgun/prompts/agents/partials/artifact_system.j2,sha256=kaqkMU-t2x3M7z-4HU4KffSFug1WM5VDsin6tCkxjHg,1528
93
93
  shotgun/prompts/agents/partials/codebase_understanding.j2,sha256=AQmN04VRzGmLbxKKthMK4hkJZ9mIU1NMKIpTDOHJrPM,5051
94
94
  shotgun/prompts/agents/partials/common_agent_system_prompt.j2,sha256=UgEHSudzfsCcKHp-Nt6tlsel8ap93z7yevbt0r9SSSg,1663
95
95
  shotgun/prompts/agents/partials/content_formatting.j2,sha256=MG0JB7SSp8YV5akDWpbs2f9DcdREIYqLp38NnoWLeQ0,1854
96
- shotgun/prompts/agents/partials/interactive_mode.j2,sha256=QYpG7Nyjmylpp0fLQhJQfY6QBV3ET6eigSTu4foIUys,671
97
- shotgun/prompts/agents/state/artifact_templates_available.j2,sha256=gs8k50_RTSfo_6DYj7MMXDm4mwXyr2yUnVQ8PQGGr5I,720
98
- shotgun/prompts/agents/state/existing_artifacts_available.j2,sha256=Z5yobwaf7sfTt94LmQ1L9vZY5upGvQeOGCPMnFkdr08,686
96
+ shotgun/prompts/agents/partials/interactive_mode.j2,sha256=dx58RoPK7HUvydOM7qEKBU33xKOj8QIVDh39RAY-90c,940
97
+ shotgun/prompts/agents/state/artifact_templates_available.j2,sha256=Jb31uOnURfLSG8RKQxHZE8zivans_sG6hKgPbC91pfk,819
98
+ shotgun/prompts/agents/state/existing_artifacts_available.j2,sha256=gb5gKYeOXcJmIkkDS1JOm68AEymLutlxNow5HTtev7I,739
99
99
  shotgun/prompts/agents/state/system_state.j2,sha256=NFuBOo7cGy0tQrnDUs3wGO19oytGNHK2K8tgoG4cw1M,274
100
100
  shotgun/prompts/agents/state/codebase/codebase_graphs_available.j2,sha256=IX9Xrg1d2uh_C4096shY_hpqhuu0RJLZpH0NbXEMSXI,413
101
101
  shotgun/prompts/codebase/__init__.py,sha256=NYuPMtmYM2ptuwf3YxVuotNlJOUq0hnjmwlzKcJkGK4,42
102
- shotgun/prompts/codebase/cypher_query_patterns.j2,sha256=4vIqiQ2JG9fQ4Xf0nSbUpZQtTNgQ1e0JhBRi2mSkGhc,8850
102
+ shotgun/prompts/codebase/cypher_query_patterns.j2,sha256=ufTx_xT3VoS76KcVUbIgGQx-bJoJHx3bBE3dagAXv18,8913
103
103
  shotgun/prompts/codebase/cypher_system.j2,sha256=kV-OJ8gM3vsBo8hW4mLSEHpJW-wV_2tNaPck3HUM52c,1497
104
104
  shotgun/prompts/codebase/enhanced_query_context.j2,sha256=WzGnFaBLZO-mOdkZ_u_PewSu9niKy87DKNL4uzQq1Jg,724
105
105
  shotgun/prompts/codebase/partials/cypher_rules.j2,sha256=vtc5OqTp-z5Rq_ti-_RG31bVOIA_iNe80_x3CdxO6bs,2397
106
- shotgun/prompts/codebase/partials/graph_schema.j2,sha256=hSzfxQ4C6Pfs6BIMeBekpMwfzQLUWmrLJkFVcYJFKMs,1832
106
+ shotgun/prompts/codebase/partials/graph_schema.j2,sha256=fUsD1ZgU1pIWUzrs97jHq3TatKeGSvZgG8XP5gCQUJc,1939
107
107
  shotgun/prompts/codebase/partials/temporal_context.j2,sha256=yYHQHBQ4EeSs6TtKPm9fflGW3y6H0-yAANcTdsApkk4,1388
108
108
  shotgun/prompts/history/__init__.py,sha256=wbMLQ8yWmYz1sfXXigEAUlNkFcM50KdQv0kp4VU_P58,43
109
109
  shotgun/prompts/history/incremental_summarization.j2,sha256=GmnNh0pWTjaEaI1sPwKNsGCys5fK8xrzWqalAs_LhJw,2447
@@ -116,23 +116,27 @@ shotgun/sdk/exceptions.py,sha256=qBcQv0v7ZTwP7CMcxZST4GqCsfOWtOUjSzGBo0-heqo,412
116
116
  shotgun/sdk/models.py,sha256=RsR9e2wiVrNGP2zTvjIZVvBlibgluuhDZlCNcw8JTTA,5488
117
117
  shotgun/sdk/services.py,sha256=WJi_AANWJZPdWdq9LntP5nlYgLxLlsFyXt28DGYNoJo,1132
118
118
  shotgun/tui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
- shotgun/tui/app.py,sha256=kaRBsz2-09ij_peNopkAxhPPHBy7zsgR8V_5tAs8VRk,3381
119
+ shotgun/tui/app.py,sha256=LjqQ4ylwVS7278bB6zZ5Uey6oD2pH9dljWymUVgYyPE,3661
120
120
  shotgun/tui/styles.tcss,sha256=ETyyw1bpMBOqTi5RLcAJUScdPWTvAWEqE9YcT0kVs_E,121
121
+ shotgun/tui/commands/__init__.py,sha256=Bvm2EwIpYXp0jsf-d4t1wMptziCpY5TJKPItN05ts-0,2393
121
122
  shotgun/tui/components/prompt_input.py,sha256=Ss-htqraHZAPaehGE4x86ij0veMjc4UgadMXpbdXr40,2229
122
123
  shotgun/tui/components/spinner.py,sha256=ovTDeaJ6FD6chZx_Aepia6R3UkPOVJ77EKHfRmn39MY,2427
123
124
  shotgun/tui/components/splash.py,sha256=vppy9vEIEvywuUKRXn2y11HwXSRkQZHLYoVjhDVdJeU,1267
124
125
  shotgun/tui/components/vertical_tail.py,sha256=kkCH0WjAh54jDvRzIaOffRZXUKn_zHFZ_ichfUpgzaE,1071
125
- shotgun/tui/screens/chat.py,sha256=Fh-D0l3OV0w_Zdeo0DOiEbDYCSpDOUSRmcEpAabc_Rs,17201
126
- shotgun/tui/screens/chat.tcss,sha256=MV7-HhXSpBxIsSbB57RugNeM0wOpqMpIVke7qCf4-yQ,312
126
+ shotgun/tui/screens/chat.py,sha256=y63oP_doU2_83UPByB8IebP3SUDqDBz96XhiL8j-snU,23922
127
+ shotgun/tui/screens/chat.tcss,sha256=2Yq3E23jxsySYsgZf4G1AYrYVcpX0UDW6kNNI0tDmtM,437
127
128
  shotgun/tui/screens/directory_setup.py,sha256=lIZ1J4A6g5Q2ZBX8epW7BhR96Dmdcg22CyiM5S-I5WU,3237
128
129
  shotgun/tui/screens/provider_config.py,sha256=A_tvDHF5KLP5PV60LjMJ_aoOdT3TjI6_g04UIUqGPqM,7126
129
130
  shotgun/tui/screens/splash.py,sha256=E2MsJihi3c9NY1L28o_MstDxGwrCnnV7zdq00MrGAsw,706
131
+ shotgun/tui/screens/chat_screen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
132
+ shotgun/tui/screens/chat_screen/command_providers.py,sha256=4Q8jR7wN4e2q0SWHSsISZP-POyu1B9lyXgoOTKB4ZLc,7198
133
+ shotgun/tui/screens/chat_screen/history.py,sha256=QAVMmtPKXtonrAuyWV6aTteqErH6U9H9V8hB1EPbIkM,5546
130
134
  shotgun/utils/__init__.py,sha256=WinIEp9oL2iMrWaDkXz2QX4nYVPAm8C9aBSKTeEwLtE,198
131
135
  shotgun/utils/env_utils.py,sha256=8QK5aw_f_V2AVTleQQlcL0RnD4sPJWXlDG46fsHu0d8,1057
132
136
  shotgun/utils/file_system_utils.py,sha256=l-0p1bEHF34OU19MahnRFdClHufThfGAjQ431teAIp0,1004
133
137
  shotgun/utils/update_checker.py,sha256=Xf-7w3Pos3etzCoT771gJe2HLkA8_V2GrqWy7ni9UqA,11373
134
- shotgun_sh-0.1.0.dev15.dist-info/METADATA,sha256=VpKsQmeuor8Mc27fgdeVfKU4xtMNpQNx9AAfwVcyEC4,11271
135
- shotgun_sh-0.1.0.dev15.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
136
- shotgun_sh-0.1.0.dev15.dist-info/entry_points.txt,sha256=asZxLU4QILneq0MWW10saVCZc4VWhZfb0wFZvERnzfA,45
137
- shotgun_sh-0.1.0.dev15.dist-info/licenses/LICENSE,sha256=YebsZl590zCHrF_acCU5pmNt0pnAfD2DmAnevJPB1tY,1065
138
- shotgun_sh-0.1.0.dev15.dist-info/RECORD,,
138
+ shotgun_sh-0.1.0.dev17.dist-info/METADATA,sha256=o4PPBFmx5v9oWsXqVW-4kNm-3LHh67PpS7J4yJvIORg,11271
139
+ shotgun_sh-0.1.0.dev17.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
140
+ shotgun_sh-0.1.0.dev17.dist-info/entry_points.txt,sha256=asZxLU4QILneq0MWW10saVCZc4VWhZfb0wFZvERnzfA,45
141
+ shotgun_sh-0.1.0.dev17.dist-info/licenses/LICENSE,sha256=YebsZl590zCHrF_acCU5pmNt0pnAfD2DmAnevJPB1tY,1065
142
+ shotgun_sh-0.1.0.dev17.dist-info/RECORD,,