shotgun-sh 0.2.19__py3-none-any.whl → 0.2.23.dev1__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.

@@ -4,9 +4,11 @@ from pathlib import Path
4
4
 
5
5
  from textual import on
6
6
  from textual.app import ComposeResult
7
- from textual.containers import Container
7
+ from textual.containers import Container, VerticalScroll
8
8
  from textual.screen import ModalScreen
9
- from textual.widgets import Button, Label, Static
9
+ from textual.widgets import Button, Label, Markdown
10
+
11
+ from shotgun.utils.file_system_utils import get_shotgun_home
10
12
 
11
13
 
12
14
  class CodebaseIndexPromptScreen(ModalScreen[bool]):
@@ -19,39 +21,88 @@ class CodebaseIndexPromptScreen(ModalScreen[bool]):
19
21
  }
20
22
 
21
23
  CodebaseIndexPromptScreen > #index-prompt-dialog {
22
- width: 60%;
23
- max-width: 60;
24
+ width: 80%;
25
+ max-width: 90;
24
26
  height: auto;
27
+ max-height: 85%;
25
28
  border: wide $primary;
26
29
  padding: 1 2;
27
30
  layout: vertical;
28
31
  background: $surface;
32
+ }
33
+
34
+ #index-prompt-title {
35
+ text-style: bold;
36
+ color: $text-accent;
37
+ text-align: center;
38
+ padding-bottom: 1;
39
+ }
40
+
41
+ #index-prompt-content {
29
42
  height: auto;
43
+ max-height: 1fr;
44
+ }
45
+
46
+ #index-prompt-info {
47
+ padding: 0 1;
30
48
  }
31
49
 
32
50
  #index-prompt-buttons {
33
51
  layout: horizontal;
34
52
  align-horizontal: right;
35
53
  height: auto;
54
+ padding-top: 1;
55
+ }
56
+
57
+ #index-prompt-buttons Button {
58
+ margin: 0 1;
59
+ min-width: 12;
36
60
  }
37
61
  """
38
62
 
39
63
  def compose(self) -> ComposeResult:
64
+ storage_path = get_shotgun_home() / "codebases"
65
+ cwd = Path.cwd()
66
+
67
+ # Build the markdown content with privacy-first messaging
68
+ content = f"""
69
+ ## 🔒 Your code never leaves your computer
70
+
71
+ Shotgun will index the codebase at:
72
+ **`{cwd}`**
73
+ _(This is the current working directory where you started Shotgun)_
74
+
75
+ ### What happens during indexing:
76
+
77
+ - **Stays on your computer**: Index is stored locally at `{storage_path}` - it will not be stored on a server
78
+ - **Zero cost**: Indexing runs entirely on your machine
79
+ - **Runs in the background**: Usually takes 1-3 minutes, and you can continue using Shotgun while it indexes
80
+ - **Enable code understanding**: Allows Shotgun to answer questions about your codebase
81
+
82
+ ---
83
+
84
+ If you're curious, you can review how Shotgun indexes/queries code by taking a look at the [source code](https://github.com/shotgun-sh/shotgun).
85
+
86
+ We take your privacy seriously. You can read our full [privacy policy](https://app.shotgun.sh/privacy) for more details.
87
+ """
88
+
40
89
  with Container(id="index-prompt-dialog"):
41
- yield Label("Index this codebase?", id="index-prompt-title")
42
- yield Static(
43
- f"Would you like to index the codebase at:\n{Path.cwd()}\n\n"
44
- "This is required for the agent to understand your code and answer "
45
- "questions about it. Without indexing, the agent cannot analyze "
46
- "your codebase."
90
+ yield Label(
91
+ "Want to index your codebase so Shotgun can understand it?",
92
+ id="index-prompt-title",
47
93
  )
94
+ with VerticalScroll(id="index-prompt-content"):
95
+ yield Markdown(content, id="index-prompt-info")
48
96
  with Container(id="index-prompt-buttons"):
97
+ yield Button(
98
+ "Not now",
99
+ id="index-prompt-cancel",
100
+ )
49
101
  yield Button(
50
102
  "Index now",
51
103
  id="index-prompt-confirm",
52
104
  variant="primary",
53
105
  )
54
- yield Button("Not now", id="index-prompt-cancel")
55
106
 
56
107
  @on(Button.Pressed, "#index-prompt-cancel")
57
108
  def handle_cancel(self, event: Button.Pressed) -> None:
@@ -1,14 +1,23 @@
1
1
  from typing import Literal
2
2
 
3
3
  from pydantic import BaseModel
4
+ from textual import on
4
5
  from textual.app import ComposeResult
6
+ from textual.containers import Horizontal
5
7
  from textual.widget import Widget
6
- from textual.widgets import Markdown
8
+ from textual.widgets import Button, Label, Markdown, Static
9
+
10
+ from shotgun.logging_config import get_logger
11
+
12
+ logger = get_logger(__name__)
7
13
 
8
14
 
9
15
  class HintMessage(BaseModel):
10
16
  message: str
11
17
  kind: Literal["hint"] = "hint"
18
+ # Optional email copy functionality
19
+ email: str | None = None
20
+ markdown_after: str | None = None
12
21
 
13
22
 
14
23
  class HintMessageWidget(Widget):
@@ -30,6 +39,30 @@ class HintMessageWidget(Widget):
30
39
  }
31
40
  }
32
41
 
42
+ HintMessageWidget .email-copy-row {
43
+ width: auto;
44
+ height: auto;
45
+ margin: 1 0;
46
+ }
47
+
48
+ HintMessageWidget .email-text {
49
+ width: auto;
50
+ margin-right: 1;
51
+ content-align: left middle;
52
+ }
53
+
54
+ HintMessageWidget .copy-btn {
55
+ width: auto;
56
+ min-width: 12;
57
+ }
58
+
59
+ HintMessageWidget #copy-status {
60
+ height: 1;
61
+ width: 100%;
62
+ margin-top: 1;
63
+ content-align: left middle;
64
+ }
65
+
33
66
  """
34
67
 
35
68
  def __init__(self, message: HintMessage) -> None:
@@ -37,4 +70,46 @@ class HintMessageWidget(Widget):
37
70
  self.message = message
38
71
 
39
72
  def compose(self) -> ComposeResult:
73
+ # Main message markdown
40
74
  yield Markdown(markdown=f"{self.message.message}")
75
+
76
+ # Optional email copy section
77
+ if self.message.email:
78
+ # Email + copy button on same line
79
+ with Horizontal(classes="email-copy-row"):
80
+ yield Static(f"Contact: {self.message.email}", classes="email-text")
81
+ yield Button("Copy email", id="copy-email-btn", classes="copy-btn")
82
+
83
+ # Status feedback label
84
+ yield Label("", id="copy-status")
85
+
86
+ # Optional markdown after email
87
+ if self.message.markdown_after:
88
+ yield Markdown(self.message.markdown_after)
89
+
90
+ @on(Button.Pressed, "#copy-email-btn")
91
+ def _copy_email(self) -> None:
92
+ """Copy email address to clipboard when button is pressed."""
93
+ if not self.message.email:
94
+ return
95
+
96
+ status_label = self.query_one("#copy-status", Label)
97
+
98
+ try:
99
+ import pyperclip # type: ignore[import-untyped] # noqa: PGH003
100
+
101
+ pyperclip.copy(self.message.email)
102
+ status_label.update("✓ Copied to clipboard!")
103
+ logger.debug(
104
+ f"Successfully copied email to clipboard: {self.message.email}"
105
+ )
106
+
107
+ except ImportError:
108
+ status_label.update(
109
+ f"⚠️ Clipboard unavailable. Please manually copy: {self.message.email}"
110
+ )
111
+ logger.warning("pyperclip not available for clipboard operations")
112
+
113
+ except Exception as e:
114
+ status_label.update(f"⚠️ Copy failed: {e}")
115
+ logger.error(f"Failed to copy email to clipboard: {e}", exc_info=True)
@@ -92,6 +92,42 @@ class ChatHistory(Widget):
92
92
  self.items = messages
93
93
  filtered = list(self.filtered_items())
94
94
 
95
+ # Handle case where streaming inflated _rendered_count but final messages differ
96
+ # This happens when error replaces ModelResponse with HintMessage
97
+ if len(filtered) <= self._rendered_count and filtered:
98
+ # Check if the last rendered item type differs from what should be there
99
+ # Children: [UserQuestion, AgentResponse, ..., PartialResponse]
100
+ # We need to check the item before PartialResponseWidget
101
+ num_children = len(self.vertical_tail.children)
102
+ if num_children > 1: # Has items besides PartialResponseWidget
103
+ last_widget = self.vertical_tail.children[-2] # Item before Partial
104
+ last_filtered = filtered[-1]
105
+
106
+ # Check type mismatch
107
+ type_mismatch = (
108
+ (
109
+ isinstance(last_widget, AgentResponseWidget)
110
+ and isinstance(last_filtered, HintMessage)
111
+ )
112
+ or (
113
+ isinstance(last_widget, HintMessageWidget)
114
+ and isinstance(last_filtered, ModelResponse)
115
+ )
116
+ or (
117
+ isinstance(last_widget, AgentResponseWidget)
118
+ and isinstance(last_filtered, ModelRequest)
119
+ )
120
+ or (
121
+ isinstance(last_widget, UserQuestionWidget)
122
+ and not isinstance(last_filtered, ModelRequest)
123
+ )
124
+ )
125
+
126
+ if type_mismatch:
127
+ # Remove the mismatched widget and adjust count
128
+ last_widget.remove()
129
+ self._rendered_count = len(filtered) - 1
130
+
95
131
  # Only mount new messages that haven't been rendered yet
96
132
  if len(filtered) > self._rendered_count:
97
133
  new_messages = filtered[self._rendered_count :]
@@ -1,4 +1,4 @@
1
- """Screen for setting up the local .shotgun directory."""
1
+ """Screen for displaying .shotgun directory creation errors."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -10,11 +10,18 @@ from textual.containers import Horizontal, Vertical
10
10
  from textual.screen import Screen
11
11
  from textual.widgets import Button, Label, Static
12
12
 
13
- from shotgun.utils.file_system_utils import ensure_shotgun_directory_exists
14
-
15
13
 
16
14
  class DirectorySetupScreen(Screen[None]):
17
- """Prompt the user to initialize the .shotgun directory."""
15
+ """Display an error when .shotgun directory creation fails."""
16
+
17
+ def __init__(self, error_message: str) -> None:
18
+ """Initialize the error screen.
19
+
20
+ Args:
21
+ error_message: The error message to display to the user.
22
+ """
23
+ super().__init__()
24
+ self.error_message = error_message
18
25
 
19
26
  CSS = """
20
27
  DirectorySetupScreen {
@@ -67,56 +74,44 @@ class DirectorySetupScreen(Screen[None]):
67
74
  """
68
75
 
69
76
  BINDINGS = [
70
- ("enter", "confirm", "Initialize"),
77
+ ("enter", "retry", "Retry"),
71
78
  ("escape", "cancel", "Exit"),
72
79
  ]
73
80
 
74
81
  def compose(self) -> ComposeResult:
75
82
  with Vertical(id="titlebox"):
76
- yield Static("Directory setup", id="directory-setup-title")
77
- yield Static("Shotgun keeps workspace data in a .shotgun directory.\n")
78
- yield Static("Initialize it in the current directory?\n")
79
- yield Static(f"[$foreground-muted]({Path.cwd().resolve()})[/]")
83
+ yield Static(
84
+ "Failed to create .shotgun directory", id="directory-setup-title"
85
+ )
86
+ yield Static("Shotgun was unable to create the .shotgun directory in:\n")
87
+ yield Static(f"[$foreground-muted]({Path.cwd().resolve()})[/]\n")
88
+ yield Static(f"[bold red]Error:[/] {self.error_message}\n")
89
+ yield Static(
90
+ "This directory is required for storing workspace data. "
91
+ "Please check permissions and try again."
92
+ )
80
93
  yield Label("", id="directory-status")
81
94
  with Horizontal(id="directory-actions"):
82
- yield Button(
83
- "Initialize and proceed \\[ENTER]", variant="primary", id="initialize"
84
- )
85
- yield Button("Exit without setup \\[ESC]", variant="default", id="exit")
95
+ yield Button("Retry \\[ENTER]", variant="primary", id="retry")
96
+ yield Button("Exit \\[ESC]", variant="default", id="exit")
86
97
 
87
98
  def on_mount(self) -> None:
88
- self.set_focus(self.query_one("#initialize", Button))
99
+ self.set_focus(self.query_one("#retry", Button))
89
100
 
90
- def action_confirm(self) -> None:
91
- self._initialize_directory()
101
+ def action_retry(self) -> None:
102
+ """Retry by dismissing the screen, which will trigger refresh_startup_screen."""
103
+ self.dismiss()
92
104
 
93
105
  def action_cancel(self) -> None:
94
- self._exit_application()
106
+ """Exit the application."""
107
+ self.app.exit()
95
108
 
96
- @on(Button.Pressed, "#initialize")
97
- def _on_initialize_pressed(self) -> None:
98
- self._initialize_directory()
109
+ @on(Button.Pressed, "#retry")
110
+ def _on_retry_pressed(self) -> None:
111
+ """Retry by dismissing the screen."""
112
+ self.dismiss()
99
113
 
100
114
  @on(Button.Pressed, "#exit")
101
115
  def _on_exit_pressed(self) -> None:
102
- self._exit_application()
103
-
104
- def _initialize_directory(self) -> None:
105
- status_label = self.query_one("#directory-status", Label)
106
- try:
107
- path = ensure_shotgun_directory_exists()
108
- except Exception as exc: # pragma: no cover - defensive; textual path
109
- status_label.update(f"❌ Failed to initialize directory: {exc}")
110
- return
111
-
112
- # Double-check a directory now exists; guard against unexpected filesystem state.
113
- if not path.is_dir():
114
- status_label.update(
115
- "❌ Unable to initialize .shotgun directory due to filesystem conflict."
116
- )
117
- return
118
-
119
- self.dismiss()
120
-
121
- def _exit_application(self) -> None:
116
+ """Exit the application."""
122
117
  self.app.exit()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shotgun-sh
3
- Version: 0.2.19
3
+ Version: 0.2.23.dev1
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
@@ -34,6 +34,7 @@ Requires-Dist: packaging>=23.0
34
34
  Requires-Dist: posthog>=3.0.0
35
35
  Requires-Dist: pydantic-ai>=0.0.14
36
36
  Requires-Dist: pydantic-settings>=2.0.0
37
+ Requires-Dist: pyperclip>=1.10.0
37
38
  Requires-Dist: rich>=13.0.0
38
39
  Requires-Dist: sentencepiece>=0.2.0
39
40
  Requires-Dist: sentry-sdk[pure-eval]>=2.0.0
@@ -377,6 +378,12 @@ We had to implement payments. Cursor, Claude Code, and Copilot all suggested bui
377
378
 
378
379
  A: We only gather minimal, anonymous events (e.g., install, server start, tool call). We don't collect the content itself—only that an event occurred. We use Sentry for error reporting to improve stability.
379
380
 
381
+ **Q: Does my code leave my computer when indexing?**
382
+
383
+ A: No. When you index your codebase, all indexing happens locally on your machine. The index is stored in `~/.shotgun-sh/codebases/` and never sent to any server. Your code stays on your computer.
384
+
385
+ ![Indexing Privacy](docs/index_codebase_privacy.png)
386
+
380
387
  **Q: Local LLMs?**
381
388
 
382
389
  A: Planned. We'll publish compatibility notes and local provider integrations.
@@ -1,7 +1,7 @@
1
1
  shotgun/__init__.py,sha256=P40K0fnIsb7SKcQrFnXZ4aREjpWchVDhvM1HxI4cyIQ,104
2
2
  shotgun/api_endpoints.py,sha256=cHNkXbaxMOw6t9M7_SGHwEkz9bL1CH_kw8qIhgdXfi0,630
3
- shotgun/build_constants.py,sha256=NnG1QMjsJRkjzvgeqGVxv89D2nyON6yaFd-Sq2R-86k,701
4
- shotgun/exceptions.py,sha256=qSt4_ZWBZ_DtDxMlZIFfdwyXRkGdCfG9dic_O-5QEKA,1102
3
+ shotgun/build_constants.py,sha256=trtP6Yz4N9fntWVWrRlSicQxahOoImwNnAnz5Laeq00,760
4
+ shotgun/exceptions.py,sha256=xGQ8yfp1QvHrnmcdIXofHs8pZvgn0nBMFr_2VWfxZrk,12404
5
5
  shotgun/logging_config.py,sha256=o9erNhWl5CvXpgEIzdpm9BmVwO1PBVm1VmgTPjpm8OI,8460
6
6
  shotgun/main.py,sha256=nDGVisdpxot95cdiWdSlA0CPQffGhWQK4BorOP5yay0,7205
7
7
  shotgun/posthog_telemetry.py,sha256=uE8JeAL2wlf3kG0lA7hylcEPYpDRrzQ-Lb8DcC1PG6o,6450
@@ -10,7 +10,7 @@ shotgun/sentry_telemetry.py,sha256=KIjkRAIio47bZtXseGXE6SSLXsCPThbz8_a_lw7pcSM,8
10
10
  shotgun/settings.py,sha256=c9FfswsmjWc0fe0HPwmZNtHVicaT_MogdHaN9B4iXg4,7359
11
11
  shotgun/telemetry.py,sha256=6trR92Q6ERvSuUGyS8VyBCv1Dfs20vI1-4BYPieLcxM,2917
12
12
  shotgun/agents/__init__.py,sha256=8Jzv1YsDuLyNPFJyckSr_qI4ehTVeDyIMDW4omsfPGc,25
13
- shotgun/agents/agent_manager.py,sha256=4qq1HE652lJXzH3HjxXJYDlrvYhEdHTxuiK8RLjHEtc,52004
13
+ shotgun/agents/agent_manager.py,sha256=zg75aQpk9COBm3yYbV9fvd7M-joTH2W3WdEkqJV0LPg,52200
14
14
  shotgun/agents/common.py,sha256=U18bN5mokVddIuhtSEG5i_uRjiLw6kx1tEaDtsTdhIw,19183
15
15
  shotgun/agents/conversation_history.py,sha256=djfzHu0ZQnEiRPDwqKaBIZK1KKPmdV7wE_L-7cAGb8M,7909
16
16
  shotgun/agents/conversation_manager.py,sha256=CvmealftUc3n3pYXBGpZ29mpXGaM8bzmbGtT4KM9sdU,5280
@@ -20,6 +20,7 @@ shotgun/agents/messages.py,sha256=wNn0qC5AqASM8LMaSGFOerZEJPn5FsIOmaJs1bdosuU,10
20
20
  shotgun/agents/models.py,sha256=anNz8_U95B1__VPXgxFqfzk2BRIHrIO4clJlnfedVS8,9862
21
21
  shotgun/agents/plan.py,sha256=7bP9VVQ5yfUE76fJEdBL-S2OIy3P-s5RdaorbThJQfc,2992
22
22
  shotgun/agents/research.py,sha256=0bkEGdmwJiHz_ubJ835xvsp2dDQpZWKrr8Qd55OadJI,3242
23
+ shotgun/agents/runner.py,sha256=sMgv1sZZz6jKQ095u9GudBMhQ91ozzYXBq5aHHlBmxo,8784
23
24
  shotgun/agents/specify.py,sha256=EsnHtQ-kRwZX_GRyp5D_y94yRaOo1gfLCIKeoF8ohNY,3099
24
25
  shotgun/agents/tasks.py,sha256=rebwa9z2-YUAQTxEhxglUKeDO5i0gAq39CmR9_LXMKE,2961
25
26
  shotgun/agents/usage_manager.py,sha256=0O1G7ovgYtJ_zCTITQ1Cks75eXMwvjl1SgGE1uoZ0x4,5383
@@ -27,7 +28,7 @@ shotgun/agents/config/README.md,sha256=Cjgt91aAhedUOPDf-powj1jXym_SvVzLcUSvROsqS
27
28
  shotgun/agents/config/__init__.py,sha256=QuGC057dzMrzhrdRJ7c8KNwWzFqISiSk3t5LqnvOVN0,471
28
29
  shotgun/agents/config/constants.py,sha256=GZ62PTrMd_yXDBvQwpNqh401GVlMHh5Li7_xM-zdp8Y,742
29
30
  shotgun/agents/config/manager.py,sha256=UC9gxmHGofr9KE4jRUieryZvxT_xz1f3Pgi9lfI-i2k,28925
30
- shotgun/agents/config/models.py,sha256=zib8MP8Nu1SWGdUwUoEo2w1sMiw9rsG6szDW37Qa1KY,7605
31
+ shotgun/agents/config/models.py,sha256=OX66Vp-b6Pw1KwsWyiG4AkRqyqXbb6toq4PHh9os8jU,7877
31
32
  shotgun/agents/config/provider.py,sha256=tyCEE15AVF38fgbJKgQACI3sIazmkoEuKGzBpw4mx5E,14770
32
33
  shotgun/agents/config/streaming_test.py,sha256=ALOM4fjYf7dH7bsY-onKYJBcYH8ujx-50RdMwvw6RXM,4443
33
34
  shotgun/agents/context_analyzer/__init__.py,sha256=p-R3SVa3yDkXnHaZ7XV_SI_9FGhoYwvnbvDr3oxGU3M,732
@@ -35,6 +36,8 @@ shotgun/agents/context_analyzer/analyzer.py,sha256=3WNdzY6gp4cfzf6uDiFnVo7P2VnFS
35
36
  shotgun/agents/context_analyzer/constants.py,sha256=oG8IJXEFN-V5wtnoz_ZBhOIGNXG1kjR4K_yOC5e95hY,323
36
37
  shotgun/agents/context_analyzer/formatter.py,sha256=QovmxUdpGkBKwxegxhvXRmHrpNFF31MoD3LRYTVCKY8,4008
37
38
  shotgun/agents/context_analyzer/models.py,sha256=Ww2NOgqaQlZ45tyBsVevt5r9bz0X-dQ4lNwAElfwAJk,8362
39
+ shotgun/agents/error/__init__.py,sha256=7md1HR_iAoCmTe5mzgQT0y3VBoC8D5zvRI4vQch4Ess,231
40
+ shotgun/agents/error/models.py,sha256=SLUCsMR0UPH0Lxm5AJKXBKTuL6wtdTzJJ3NHDzAIk_I,501
38
41
  shotgun/agents/history/__init__.py,sha256=XFQj2a6fxDqVg0Q3juvN9RjV_RJbgvFZtQOCOjVJyp4,147
39
42
  shotgun/agents/history/compaction.py,sha256=S7U00K3-tHOBHjSseGLaNSozkfmZknnqNyat8Hcixfk,3923
40
43
  shotgun/agents/history/constants.py,sha256=yWY8rrTZarLA3flCCMB_hS2NMvUDRDTwP4D4j7MIh1w,446
@@ -44,7 +47,7 @@ shotgun/agents/history/history_processors.py,sha256=X1H8kuS0lfiBGBoPmfGhnIVSMLFC
44
47
  shotgun/agents/history/message_utils.py,sha256=aPusAl2RYKbjc7lBxPaNprRHmZEG6fe97q7DQUlhlzU,2918
45
48
  shotgun/agents/history/token_estimation.py,sha256=iRyKq-YDivEpJrULIbQgNpjhOuSC4nHVJYfsWEFV8sQ,4770
46
49
  shotgun/agents/history/token_counting/__init__.py,sha256=YZt5Lus--fkF6l1hdkIlp1e_oAIpACNwHOI0FRP4q8s,924
47
- shotgun/agents/history/token_counting/anthropic.py,sha256=kGxfDF4GyaPbNnS4DUiOM5EPThEBXBOgbxbO_W8iBXo,4575
50
+ shotgun/agents/history/token_counting/anthropic.py,sha256=999gzwEn3Q31nmCDlJqJtt3maU4NtkEgr9PaUJdVKa4,4931
48
51
  shotgun/agents/history/token_counting/base.py,sha256=eVtNmFnnDcsX3E9GE-OH_4_ibdlwg4fETi2cq60sqLw,2327
49
52
  shotgun/agents/history/token_counting/openai.py,sha256=lZgoMSVSlBN899Cp8sMFggYVDiSaqB-gTHUSaRoQ0yk,2746
50
53
  shotgun/agents/history/token_counting/sentencepiece_counter.py,sha256=JTSWGAuCtqa7e2fJQzNQ52HqprSJJOcMZLnwxDId-vk,4201
@@ -69,14 +72,15 @@ shotgun/cli/__init__.py,sha256=_F1uW2g87y4bGFxz8Gp8u7mq2voHp8vQIUtCmm8Tojo,40
69
72
  shotgun/cli/clear.py,sha256=_mAb3cjlLNGAk19Bu1fKoSF1fpBg05vRIRfSFZzhUyw,1625
70
73
  shotgun/cli/compact.py,sha256=ZF8bS3hReJYG_uzRfWwCi9cINeZwzvre9SK7A-a9qRk,5914
71
74
  shotgun/cli/config.py,sha256=wKBPSQ8ZVF6ITPS_bE2F46_xyWiI80QJhhgjt8uuDSY,8031
72
- shotgun/cli/context.py,sha256=sRCNKM_irXASOJclAbYdz8-ftwdBIv68Qyin_w8KK8k,3813
73
- shotgun/cli/export.py,sha256=xe14DKxeL9zN9M2bomuiXxa2JdqIZ1FBPPkTFBVhkxQ,2484
75
+ shotgun/cli/context.py,sha256=ocsPv3LOHHR7uw4VsipQ2Iq5tY7YlmTX7CBuiFCSQCg,5438
76
+ shotgun/cli/error_handler.py,sha256=neU0dL5zAv4HbrJGIw3Py2wqyA6BzJo3tbpWaZtPidk,646
77
+ shotgun/cli/export.py,sha256=k3g32DPMlGlwE8Nd5pLiuMQ64Aa_FY-DOP_yCt3ae1c,2651
74
78
  shotgun/cli/feedback.py,sha256=wMRIN6UtBI4832XfUwE7nQLjVLuVu4zjupMme02nfwc,1346
75
79
  shotgun/cli/models.py,sha256=cutimFStP6m5pXmg3kbhtWZjNA2us2cPQFJtz2pTdOU,208
76
- shotgun/cli/plan.py,sha256=PbD7ckPIgdDOp7RLQecf4F1S59W_Bag2qMTcR6QqlDw,2337
77
- shotgun/cli/research.py,sha256=chFMuVcznuJqnGwDcK7o1Qk3RQ4q0cFPqRQjyW_GURw,2496
78
- shotgun/cli/specify.py,sha256=gLbnZ4GP9QmRy1QFdhF2mnXqP9Fbo07CY-3GdmbbL3w,2179
79
- shotgun/cli/tasks.py,sha256=GIgwS5a-B92BghjlD0lMDEZd35Izl0S4QguRrdFxciI,2433
80
+ shotgun/cli/plan.py,sha256=mbM-OiCkrR3uWHIwm2M0Zub7wk3GOd5Mnl6_dPZjmKQ,2496
81
+ shotgun/cli/research.py,sha256=WUnMjV0a7u6ATAEydyWOAhEWyrtcalvhFq1_ERYPiD0,3010
82
+ shotgun/cli/specify.py,sha256=TrvcWP9XfxJqeD3IXRKAZ6RkudLFDjsLbTcm5vy_nPU,2383
83
+ shotgun/cli/tasks.py,sha256=1_H6PGjNljMw6UeeTFAhwhsxsMLVF0shuyFGaN_w0rM,2590
80
84
  shotgun/cli/update.py,sha256=sc3uuw3AXFF0kpskWah1JEoTwrKv67fCnqp9BjeND3o,5328
81
85
  shotgun/cli/utils.py,sha256=umVWXDx8pelovMk-nT8B7m0c39AKY9hHsuAMnbw_Hcg,732
82
86
  shotgun/cli/codebase/__init__.py,sha256=rKdvx33p0i_BYbNkz5_4DCFgEMwzOOqLi9f5p7XTLKM,73
@@ -94,9 +98,11 @@ shotgun/codebase/core/language_config.py,sha256=vsqHyuFnumRPRBV1lMOxWKNOIiClO6Fy
94
98
  shotgun/codebase/core/manager.py,sha256=8FbiLyTe2JDELgx1tpOv_Kqba8J7QSXyORCAO3dERmk,66722
95
99
  shotgun/codebase/core/nl_query.py,sha256=qH32btb5w7eY2ij7-wc6Z0QXIDOqjz0pZXXRUboSbYs,16121
96
100
  shotgun/codebase/core/parser_loader.py,sha256=LZRrDS8Sp518jIu3tQW-BxdwJ86lnsTteI478ER9Td8,4278
97
- shotgun/llm_proxy/__init__.py,sha256=3ST3ygtf2sXXSOjIFHxVZ5xqRbT3TF7jpNHwuZAtIwA,452
101
+ shotgun/llm_proxy/__init__.py,sha256=z7YnPfyhW0WYrz6tHOoVcVOoi6iO0zWjUHbpu6o38oA,817
102
+ shotgun/llm_proxy/client.py,sha256=qtmJng-ESRbiXqw-Dn8zMduF5MEiNJdkPbG4uu4u4XU,6507
98
103
  shotgun/llm_proxy/clients.py,sha256=Y19W8Gb2e-37w8rUKPmxJOqoTk6GlcPhZhoeAbbURU0,1341
99
104
  shotgun/llm_proxy/constants.py,sha256=_4piKdyvM7pAIRdAGrzYexwWoDlueUZiEMfwWrOa4T0,381
105
+ shotgun/llm_proxy/models.py,sha256=KzYcBjE5yiiU9hpkvExQKCnySrv44EdgTTM9XSxRBVE,4375
100
106
  shotgun/prompts/__init__.py,sha256=RswUm0HMdfm2m2YKUwUsEdRIwoczdbI7zlucoEvHYRo,132
101
107
  shotgun/prompts/loader.py,sha256=_7CdUYrAo6ZwvTBUlXugKyLU0IDBg5CVzUIAHFPw418,4433
102
108
  shotgun/prompts/agents/__init__.py,sha256=YRIJMbzpArojNX1BP5gfxxois334z_GQga8T-xyWMbY,39
@@ -123,7 +129,7 @@ shotgun/prompts/history/incremental_summarization.j2,sha256=GmnNh0pWTjaEaI1sPwKN
123
129
  shotgun/prompts/history/summarization.j2,sha256=OYNVHg65zbuWB6_pXzTOs2T2k5qFD2gyfbmr6NP01rs,2268
124
130
  shotgun/prompts/tools/web_search.j2,sha256=_F1m5UYiZENPQCqTUiO2du9Lkzs1SWujjAiauDD_5-Y,568
125
131
  shotgun/sdk/__init__.py,sha256=ESV0WM9MigjXG30g9qVjcCMI40GQv-P-MSMGVuOisK4,380
126
- shotgun/sdk/codebase.py,sha256=7doUvwwl27RDJZIbP56LQsAx26GANtAKEBptTUhLT6w,8842
132
+ shotgun/sdk/codebase.py,sha256=wscfPjqrutoASD24hMJp42sghray4wmUPc5NZ8UMH5g,9119
127
133
  shotgun/sdk/exceptions.py,sha256=qBcQv0v7ZTwP7CMcxZST4GqCsfOWtOUjSzGBo0-heqo,412
128
134
  shotgun/sdk/models.py,sha256=X9nOTUHH0cdkQW1NfnMEDu-QgK9oUsEISh1Jtwr5Am4,5496
129
135
  shotgun/sdk/services.py,sha256=J4PJFSxCQ6--u7rb3Ta-9eYtlYcxcbnzrMP6ThyCnw4,705
@@ -132,7 +138,7 @@ shotgun/shotgun_web/client.py,sha256=n5DDuVfSa6VPZjhSsfSxQlSFOnhgDHyidRnB8Hv9XF4
132
138
  shotgun/shotgun_web/constants.py,sha256=eNvtjlu81bAVQaCwZXOVjSpDopUm9pf34XuZEvuMiko,661
133
139
  shotgun/shotgun_web/models.py,sha256=Ie9VfqKZM2tIJhIjentU9qLoNaMZvnUJaIu-xg9kQsA,1391
134
140
  shotgun/tui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
135
- shotgun/tui/app.py,sha256=0TxU44NzlyGg4UNZ5i1uuxiIYb-rICWr-N3x-LSrTB8,12883
141
+ shotgun/tui/app.py,sha256=UO8LEBVOWmmkDxo3ZLJggIl6tUri8QeCotFkfyH8OxM,13926
136
142
  shotgun/tui/containers.py,sha256=c2gJnFWab873F8IDOwgUBM-2ukf2kbIlO7_s20JxH1w,3540
137
143
  shotgun/tui/dependencies.py,sha256=I8xIPUujCeQqqkkKbNYrsL6dCA2MfQ8Vlh4Q0VGlAfI,1331
138
144
  shotgun/tui/filtered_codebase_service.py,sha256=lJ8gTMhIveTatmvmGLP299msWWTkVYKwvY_2FhuL2s4,1687
@@ -148,7 +154,7 @@ shotgun/tui/components/status_bar.py,sha256=ctfk1YcHBb9-iwAw3VOO6gLoSrcjvykFOxMl
148
154
  shotgun/tui/components/vertical_tail.py,sha256=kROwTaRjUwVB7H35dtmNcUVPQqNYvvfq7K2tXBKEb6c,638
149
155
  shotgun/tui/screens/chat.tcss,sha256=7jM4YTBj-N-5T4NIiU2AJiGtKYvYO50OAkI0o7_qimI,574
150
156
  shotgun/tui/screens/confirmation_dialog.py,sha256=62RYcTSfZHLH77bewmtSEeGgLRyYvCQh16ZoZuIE1J0,4788
151
- shotgun/tui/screens/directory_setup.py,sha256=VYxZWlZCZj_DgAI8tsqOAG_yECTl9yQZPPoSnNnBDoA,3505
157
+ shotgun/tui/screens/directory_setup.py,sha256=cwtl9KRsSnpm7HbGx84TE6wahUXKeXbi8L0TRtCfYJQ,3274
152
158
  shotgun/tui/screens/feedback.py,sha256=BRrAcgDMAVsEvCNFYjuqdF6FmqzuqiBxeLz4Ah7MGMQ,5955
153
159
  shotgun/tui/screens/github_issue.py,sha256=OdjaNLb997UOqVTWMq-GawVbTPjxarynMb-y0ktxeCA,3178
154
160
  shotgun/tui/screens/model_picker.py,sha256=nOKl--vCxS7tgYFU6HSYqwxtfqOLYwT14KvC9f_VdDk,13167
@@ -160,17 +166,17 @@ shotgun/tui/screens/splash.py,sha256=E2MsJihi3c9NY1L28o_MstDxGwrCnnV7zdq00MrGAsw
160
166
  shotgun/tui/screens/welcome.py,sha256=PphOGzoqnmY3cGGg2wJX4Ytgf2DPifL7KGM4czU4L1M,7740
161
167
  shotgun/tui/screens/chat/__init__.py,sha256=wChPqpJG-7kPYVYZjE8BlkXWxfW_YABhTR2fQ51opHY,113
162
168
  shotgun/tui/screens/chat/chat.tcss,sha256=7jM4YTBj-N-5T4NIiU2AJiGtKYvYO50OAkI0o7_qimI,574
163
- shotgun/tui/screens/chat/chat_screen.py,sha256=QhwMj-HuQ9hIQzaUIcKU84f5Bj8_MsU1EVkpSMKpIj8,52229
164
- shotgun/tui/screens/chat/codebase_index_prompt_screen.py,sha256=QjqOOqaXJks-82prEHCUnIZbmNBoGb2FLqxet_dUUYM,2070
169
+ shotgun/tui/screens/chat/chat_screen.py,sha256=LTnSQ3mJJ20CQj9i1WPzPHm601JfA45hVRrlHfGYY6Q,55407
170
+ shotgun/tui/screens/chat/codebase_index_prompt_screen.py,sha256=hPOroZzBhEAT447JVUul58CrmwEORWvvP4Dm6s7QfgA,3573
165
171
  shotgun/tui/screens/chat/codebase_index_selection.py,sha256=Zz0vi3uLhWysdPHRO8Rye9QX4hIPeWhSAw6Y9-BlOVA,241
166
172
  shotgun/tui/screens/chat/help_text.py,sha256=MkDq0Z7yQCXHVtLlnZaFU_Ijq1rbQX9KMOGVsb_1Hm8,1610
167
173
  shotgun/tui/screens/chat/prompt_history.py,sha256=uL3KVFb32vD09jN338mebFAi0QI-EJXTxcEQy-j6QdQ,1201
168
174
  shotgun/tui/screens/chat_screen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
169
175
  shotgun/tui/screens/chat_screen/command_providers.py,sha256=O9H_SGdXny2lYH7qQNmoQUvYv59Fg_v5tlICzCGT9Zc,15582
170
- shotgun/tui/screens/chat_screen/hint_message.py,sha256=WOpbk8q7qt7eOHTyyHvh_IQIaublVDeJGaLpsxEk9FA,933
176
+ shotgun/tui/screens/chat_screen/hint_message.py,sha256=aeG3TB8lamc7VeGUST16A96y6dYc8u3FuTxymM5BI-w,3361
171
177
  shotgun/tui/screens/chat_screen/history/__init__.py,sha256=PRznBlnm9caNE0YYC08PkvNMAK-JpuULwmByaRNTKO0,581
172
178
  shotgun/tui/screens/chat_screen/history/agent_response.py,sha256=m-RtSg77y-g_mzkVHOBMTMSW1ZE6RUCUYupn-PylPcc,2378
173
- shotgun/tui/screens/chat_screen/history/chat_history.py,sha256=KYgeyvXUOgIFjSktpixS-dnLATwl6YKjnOyj2UDeT5g,4024
179
+ shotgun/tui/screens/chat_screen/history/chat_history.py,sha256=fxAZPVsw3c_9d9P3nwE5dLYQ9gg8ln7RKJfZZCf9ESo,5777
174
180
  shotgun/tui/screens/chat_screen/history/formatters.py,sha256=R1roy6Ap04dUJ7clMLtYqSLkCMD6g2K6sVanOpDGwdc,4616
175
181
  shotgun/tui/screens/chat_screen/history/partial_response.py,sha256=loMaUoXLphnRh3gl4xvmTtkfaFY-ULrSDjndAWQcy1s,1318
176
182
  shotgun/tui/screens/chat_screen/history/user_question.py,sha256=BKl4FVKh4veszykkfr8RI06O5NEDIBZ17IZSCLzlImA,1305
@@ -189,8 +195,8 @@ shotgun/utils/file_system_utils.py,sha256=zuuWO12bzSfeocTbi4DHVJKJTBekjP-_vRmb36
189
195
  shotgun/utils/marketing.py,sha256=WAPEtJDagNsDmIBdrZ0XBHOgsLONz_eT25wEng-HDBs,3759
190
196
  shotgun/utils/source_detection.py,sha256=Co6Q03R3fT771TF3RzB-70stfjNP2S4F_ArZKibwzm8,454
191
197
  shotgun/utils/update_checker.py,sha256=6fjiVUXgdxUrI54dfw0xBsrw7jlobYkjYNZaR-JoTpI,9667
192
- shotgun_sh-0.2.19.dist-info/METADATA,sha256=mwoVqRbg9rk_f-dn2RgPmTlRO-zYYdiqgJNnAvuqfFs,15638
193
- shotgun_sh-0.2.19.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
194
- shotgun_sh-0.2.19.dist-info/entry_points.txt,sha256=GQmtjKaPtviqYOuB3C0SMGlG5RZS9-VDDIKxV_IVHmY,75
195
- shotgun_sh-0.2.19.dist-info/licenses/LICENSE,sha256=ZZEiPnjIkv3rNT-CJBMU6l7VukLUdddCo3bTwal1NIQ,1070
196
- shotgun_sh-0.2.19.dist-info/RECORD,,
198
+ shotgun_sh-0.2.23.dev1.dist-info/METADATA,sha256=D00bw844F9sDrmZf4JRKSFViNcNAmb1AEgCrkRubX64,15982
199
+ shotgun_sh-0.2.23.dev1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
200
+ shotgun_sh-0.2.23.dev1.dist-info/entry_points.txt,sha256=GQmtjKaPtviqYOuB3C0SMGlG5RZS9-VDDIKxV_IVHmY,75
201
+ shotgun_sh-0.2.23.dev1.dist-info/licenses/LICENSE,sha256=ZZEiPnjIkv3rNT-CJBMU6l7VukLUdddCo3bTwal1NIQ,1070
202
+ shotgun_sh-0.2.23.dev1.dist-info/RECORD,,