shotgun-sh 0.1.0.dev15__py3-none-any.whl → 0.1.0.dev16__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,197 @@
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 Plan Mode",
57
+ "📋 Create comprehensive, actionable plans with milestones",
58
+ lambda: self.set_mode(AgentType.PLAN),
59
+ AgentType.PLAN,
60
+ ),
61
+ (
62
+ "Switch to Tasks Mode",
63
+ "✅ Generate specific, actionable tasks from research and plans",
64
+ lambda: self.set_mode(AgentType.TASKS),
65
+ AgentType.TASKS,
66
+ ),
67
+ ]
68
+
69
+ for title, help_text, callback, mode in commands:
70
+ if self.chat_screen.mode == mode:
71
+ continue
72
+ score = matcher.match(title)
73
+ if score > 0:
74
+ yield Hit(score, matcher.highlight(title), callback, help=help_text)
75
+
76
+
77
+ class ProviderSetupProvider(Provider):
78
+ """Command palette entries for provider configuration."""
79
+
80
+ @property
81
+ def chat_screen(self) -> "ChatScreen":
82
+ from shotgun.tui.screens.chat import ChatScreen
83
+
84
+ return cast(ChatScreen, self.screen)
85
+
86
+ def open_provider_config(self) -> None:
87
+ """Show the provider configuration screen."""
88
+ self.chat_screen.app.push_screen("provider_config")
89
+
90
+ async def discover(self) -> AsyncGenerator[DiscoveryHit, None]:
91
+ yield DiscoveryHit(
92
+ "Open Provider Setup",
93
+ self.open_provider_config,
94
+ help="⚙️ Manage API keys for available providers",
95
+ )
96
+
97
+ async def search(self, query: str) -> AsyncGenerator[Hit, None]:
98
+ matcher = self.matcher(query)
99
+ title = "Open Provider Setup"
100
+ score = matcher.match(title)
101
+ if score > 0:
102
+ yield Hit(
103
+ score,
104
+ matcher.highlight(title),
105
+ self.open_provider_config,
106
+ help="⚙️ Manage API keys for available providers",
107
+ )
108
+
109
+
110
+ class CodebaseCommandProvider(Provider):
111
+ """Command palette entries for codebase management."""
112
+
113
+ @property
114
+ def chat_screen(self) -> "ChatScreen":
115
+ from shotgun.tui.screens.chat import ChatScreen
116
+
117
+ return cast(ChatScreen, self.screen)
118
+
119
+ async def discover(self) -> AsyncGenerator[DiscoveryHit, None]:
120
+ yield DiscoveryHit(
121
+ "Codebase: Index Codebase",
122
+ self.chat_screen.index_codebase_command,
123
+ help="Index a repository into the codebase graph",
124
+ )
125
+ yield DiscoveryHit(
126
+ "Codebase: Delete Codebase Index",
127
+ self.chat_screen.delete_codebase_command,
128
+ help="Delete an existing codebase index",
129
+ )
130
+
131
+ async def search(self, query: str) -> AsyncGenerator[Hit, None]:
132
+ matcher = self.matcher(query)
133
+ commands = [
134
+ (
135
+ "Codebase: Index Codebase",
136
+ self.chat_screen.index_codebase_command,
137
+ "Index a repository into the codebase graph",
138
+ ),
139
+ (
140
+ "Codebase: Delete Codebase Index",
141
+ self.chat_screen.delete_codebase_command,
142
+ "Delete an existing codebase index",
143
+ ),
144
+ ]
145
+ for title, callback, help_text in commands:
146
+ score = matcher.match(title)
147
+ if score > 0:
148
+ yield Hit(score, matcher.highlight(title), callback, help=help_text)
149
+
150
+
151
+ class DeleteCodebasePaletteProvider(Provider):
152
+ """Provider that lists indexed codebases for deletion."""
153
+
154
+ @property
155
+ def chat_screen(self) -> "ChatScreen":
156
+ from shotgun.tui.screens.chat import ChatScreen
157
+
158
+ return cast(ChatScreen, self.screen)
159
+
160
+ async def _codebases(self) -> list[CodebaseGraph]:
161
+ try:
162
+ result = await self.chat_screen.codebase_sdk.list_codebases()
163
+ except Exception as exc: # pragma: no cover - defensive UI path
164
+ self.chat_screen.notify(
165
+ f"Unable to load codebases: {exc}", severity="error"
166
+ )
167
+ return []
168
+ return result.graphs
169
+
170
+ async def discover(self) -> AsyncGenerator[DiscoveryHit, None]:
171
+ graphs = await self._codebases()
172
+ for graph in graphs:
173
+ title = f"Delete {graph.name}"
174
+ help_text = f"{graph.graph_id} • {graph.repo_path}"
175
+ yield DiscoveryHit(
176
+ title,
177
+ lambda graph_id=graph.graph_id: self.chat_screen.delete_codebase_from_palette(
178
+ graph_id
179
+ ),
180
+ help=help_text,
181
+ )
182
+
183
+ async def search(self, query: str) -> AsyncGenerator[Hit, None]:
184
+ matcher = self.matcher(query)
185
+ graphs = await self._codebases()
186
+ for graph in graphs:
187
+ display = f"{graph.name} ({graph.graph_id[:8]})"
188
+ score = matcher.match(display)
189
+ if score > 0:
190
+ yield Hit(
191
+ score,
192
+ matcher.highlight(display),
193
+ lambda graph_id=graph.graph_id: self.chat_screen.delete_codebase_from_palette(
194
+ graph_id
195
+ ),
196
+ help=graph.repo_path,
197
+ )
@@ -0,0 +1,160 @@
1
+ from pydantic_ai.messages import (
2
+ BuiltinToolCallPart,
3
+ BuiltinToolReturnPart,
4
+ ModelMessage,
5
+ ModelRequest,
6
+ ModelResponse,
7
+ TextPart,
8
+ ThinkingPart,
9
+ ToolCallPart,
10
+ )
11
+ from textual.app import ComposeResult
12
+ from textual.reactive import reactive
13
+ from textual.widget import Widget
14
+ from textual.widgets import Markdown
15
+
16
+ from shotgun.tui.components.vertical_tail import VerticalTail
17
+
18
+
19
+ class PartialResponseWidget(Widget): # TODO: doesn't work lol
20
+ DEFAULT_CSS = """
21
+ PartialResponseWidget {
22
+ height: auto;
23
+ }
24
+ Markdown, AgentResponseWidget, UserQuestionWidget {
25
+ height: auto;
26
+ }
27
+ """
28
+
29
+ item: reactive[ModelMessage | None] = reactive(None, recompose=True)
30
+
31
+ def __init__(self, item: ModelMessage | None) -> None:
32
+ super().__init__()
33
+ self.item = item
34
+
35
+ def compose(self) -> ComposeResult:
36
+ if self.item is None:
37
+ pass
38
+ elif self.item.kind == "response":
39
+ yield AgentResponseWidget(self.item)
40
+ elif self.item.kind == "request":
41
+ yield UserQuestionWidget(self.item)
42
+
43
+ def watch_item(self, item: ModelMessage | None) -> None:
44
+ if item is None:
45
+ self.display = False
46
+ else:
47
+ self.display = True
48
+
49
+
50
+ class ChatHistory(Widget):
51
+ DEFAULT_CSS = """
52
+ VerticalTail {
53
+ align: left bottom;
54
+
55
+ }
56
+ VerticalTail > * {
57
+ height: auto;
58
+ }
59
+
60
+ Horizontal {
61
+ height: auto;
62
+ background: $secondary-muted;
63
+ }
64
+
65
+ Markdown {
66
+ height: auto;
67
+ }
68
+ """
69
+ partial_response: reactive[ModelMessage | None] = reactive(None)
70
+
71
+ def __init__(self) -> None:
72
+ super().__init__()
73
+ self.items: list[ModelMessage] = []
74
+ self.vertical_tail: VerticalTail | None = None
75
+ self.partial_response = None
76
+
77
+ def compose(self) -> ComposeResult:
78
+ self.vertical_tail = VerticalTail()
79
+ yield self.vertical_tail
80
+ yield PartialResponseWidget(self.partial_response).data_bind(
81
+ item=ChatHistory.partial_response
82
+ )
83
+
84
+ def update_messages(self, messages: list[ModelMessage]) -> None:
85
+ """Update the displayed messages without recomposing."""
86
+ if not self.vertical_tail:
87
+ return
88
+
89
+ # Clear existing widgets
90
+ self.vertical_tail.remove_children()
91
+
92
+ # Add new message widgets
93
+ for item in messages:
94
+ if isinstance(item, ModelRequest):
95
+ self.vertical_tail.mount(UserQuestionWidget(item))
96
+ elif isinstance(item, ModelResponse):
97
+ self.vertical_tail.mount(AgentResponseWidget(item))
98
+
99
+ self.items = messages
100
+
101
+
102
+ class UserQuestionWidget(Widget):
103
+ def __init__(self, item: ModelRequest | None) -> None:
104
+ super().__init__()
105
+ self.item = item
106
+
107
+ def compose(self) -> ComposeResult:
108
+ self.display = self.item is not None
109
+ if self.item is None:
110
+ yield Markdown(markdown="")
111
+ else:
112
+ prompt = "".join(
113
+ str(part.content) for part in self.item.parts if part.content
114
+ )
115
+ yield Markdown(markdown=f"**>** {prompt}")
116
+
117
+
118
+ class AgentResponseWidget(Widget):
119
+ def __init__(self, item: ModelResponse | None) -> None:
120
+ super().__init__()
121
+ self.item = item
122
+
123
+ def compose(self) -> ComposeResult:
124
+ self.display = self.item is not None
125
+ if self.item is None:
126
+ yield Markdown(markdown="")
127
+ else:
128
+ yield Markdown(markdown=f"**⏺** {self.compute_output()}")
129
+
130
+ def compute_output(self) -> str:
131
+ acc = ""
132
+ if self.item is None:
133
+ return ""
134
+ for part in self.item.parts: # TextPart | ToolCallPart | BuiltinToolCallPart | BuiltinToolReturnPart | ThinkingPart
135
+ if isinstance(part, TextPart):
136
+ acc += part.content + "\n\n"
137
+ elif isinstance(part, ToolCallPart):
138
+ parts_str = self._format_tool_call_part(part)
139
+ acc += parts_str + "\n\n"
140
+ elif isinstance(part, BuiltinToolCallPart):
141
+ acc += f"{part.tool_name}({part.args})\n\n"
142
+ elif isinstance(part, BuiltinToolReturnPart):
143
+ acc += f"{part.tool_name}()\n\n"
144
+ elif isinstance(part, ThinkingPart):
145
+ acc += f"{part.content}\n\n"
146
+ return acc.strip()
147
+
148
+ def _format_tool_call_part(self, part: ToolCallPart) -> str:
149
+ if part.tool_name == "write_artifact_section":
150
+ if isinstance(part.args, dict) and "section_title" in part.args:
151
+ return f"{part.tool_name}({part.args['section_title']})"
152
+ else:
153
+ return f"{part.tool_name}()"
154
+ if part.tool_name == "create_artifact":
155
+ if isinstance(part.args, dict) and "name" in part.args:
156
+ return f"{part.tool_name}({part.args['name']})"
157
+ else:
158
+ return f"{part.tool_name}()"
159
+
160
+ 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.dev16
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
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
92
  shotgun/prompts/agents/partials/artifact_system.j2,sha256=AD1CvHDSZEmjplmDw443PeOmcXUgM5JdNLu1_mz18kM,1678
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=x9_wdXl6Mbgwr_UfNfvWEkU-ua-Ph--9BmgrkIv-BEY,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=jeryNT0WGeU6-8UTdEQk0C8A_HgNGrTskBgpqMDyAQU,6952
133
+ shotgun/tui/screens/chat_screen/history.py,sha256=eC8Md4wNyLv19exKLitNadyylTMmm7Rk8acd9h1QXtU,5062
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.dev16.dist-info/METADATA,sha256=BZyZEVZzVDYuVHHMhlc-SkciK_ocrPFpujSW9MtZINU,11271
139
+ shotgun_sh-0.1.0.dev16.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
140
+ shotgun_sh-0.1.0.dev16.dist-info/entry_points.txt,sha256=asZxLU4QILneq0MWW10saVCZc4VWhZfb0wFZvERnzfA,45
141
+ shotgun_sh-0.1.0.dev16.dist-info/licenses/LICENSE,sha256=YebsZl590zCHrF_acCU5pmNt0pnAfD2DmAnevJPB1tY,1065
142
+ shotgun_sh-0.1.0.dev16.dist-info/RECORD,,