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.
- shotgun/agents/agent_manager.py +4 -1
- shotgun/agents/config/models.py +9 -0
- shotgun/agents/error/__init__.py +11 -0
- shotgun/agents/error/models.py +19 -0
- shotgun/agents/history/token_counting/anthropic.py +8 -0
- shotgun/agents/runner.py +230 -0
- shotgun/build_constants.py +2 -2
- shotgun/cli/context.py +43 -0
- shotgun/cli/error_handler.py +24 -0
- shotgun/cli/export.py +34 -34
- shotgun/cli/plan.py +34 -34
- shotgun/cli/research.py +17 -9
- shotgun/cli/specify.py +20 -19
- shotgun/cli/tasks.py +34 -34
- shotgun/exceptions.py +323 -0
- shotgun/llm_proxy/__init__.py +17 -0
- shotgun/llm_proxy/client.py +215 -0
- shotgun/llm_proxy/models.py +137 -0
- shotgun/sdk/codebase.py +14 -3
- shotgun/tui/app.py +28 -9
- shotgun/tui/screens/chat/chat_screen.py +126 -56
- shotgun/tui/screens/chat/codebase_index_prompt_screen.py +62 -11
- shotgun/tui/screens/chat_screen/hint_message.py +76 -1
- shotgun/tui/screens/chat_screen/history/chat_history.py +36 -0
- shotgun/tui/screens/directory_setup.py +35 -40
- {shotgun_sh-0.2.19.dist-info → shotgun_sh-0.2.23.dev1.dist-info}/METADATA +8 -1
- {shotgun_sh-0.2.19.dist-info → shotgun_sh-0.2.23.dev1.dist-info}/RECORD +30 -24
- {shotgun_sh-0.2.19.dist-info → shotgun_sh-0.2.23.dev1.dist-info}/WHEEL +0 -0
- {shotgun_sh-0.2.19.dist-info → shotgun_sh-0.2.23.dev1.dist-info}/entry_points.txt +0 -0
- {shotgun_sh-0.2.19.dist-info → shotgun_sh-0.2.23.dev1.dist-info}/licenses/LICENSE +0 -0
|
@@ -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,
|
|
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:
|
|
23
|
-
max-width:
|
|
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(
|
|
42
|
-
|
|
43
|
-
|
|
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
|
|
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
|
-
"""
|
|
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", "
|
|
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(
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
yield Static(
|
|
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
|
-
|
|
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("#
|
|
99
|
+
self.set_focus(self.query_one("#retry", Button))
|
|
89
100
|
|
|
90
|
-
def
|
|
91
|
-
|
|
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
|
-
|
|
106
|
+
"""Exit the application."""
|
|
107
|
+
self.app.exit()
|
|
95
108
|
|
|
96
|
-
@on(Button.Pressed, "#
|
|
97
|
-
def
|
|
98
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
+

|
|
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=
|
|
4
|
-
shotgun/exceptions.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
73
|
-
shotgun/cli/
|
|
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=
|
|
77
|
-
shotgun/cli/research.py,sha256=
|
|
78
|
-
shotgun/cli/specify.py,sha256=
|
|
79
|
-
shotgun/cli/tasks.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
164
|
-
shotgun/tui/screens/chat/codebase_index_prompt_screen.py,sha256=
|
|
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=
|
|
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=
|
|
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.
|
|
193
|
-
shotgun_sh-0.2.
|
|
194
|
-
shotgun_sh-0.2.
|
|
195
|
-
shotgun_sh-0.2.
|
|
196
|
-
shotgun_sh-0.2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|