shotgun-sh 0.2.1.dev3__py3-none-any.whl → 0.2.1.dev5__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.

@@ -0,0 +1,295 @@
1
+ """Shotgun Account authentication screen."""
2
+
3
+ import asyncio
4
+ import webbrowser
5
+ from typing import TYPE_CHECKING, cast
6
+
7
+ import httpx
8
+ from textual import on
9
+ from textual.app import ComposeResult
10
+ from textual.containers import Vertical
11
+ from textual.screen import Screen
12
+ from textual.widgets import Button, Label, Markdown, Static
13
+ from textual.worker import Worker, WorkerState
14
+
15
+ from shotgun.agents.config import ConfigManager
16
+ from shotgun.logging_config import get_logger
17
+ from shotgun.shotgun_web import (
18
+ ShotgunWebClient,
19
+ TokenStatus,
20
+ )
21
+ from shotgun.shotgun_web.constants import DEFAULT_POLL_INTERVAL_SECONDS
22
+
23
+ if TYPE_CHECKING:
24
+ from ..app import ShotgunApp
25
+
26
+ logger = get_logger(__name__)
27
+
28
+
29
+ class ShotgunAuthScreen(Screen[bool]):
30
+ """Screen for Shotgun Account authentication flow.
31
+
32
+ Returns True if authentication was successful, False otherwise.
33
+ """
34
+
35
+ CSS = """
36
+ ShotgunAuth {
37
+ layout: vertical;
38
+ }
39
+
40
+ #titlebox {
41
+ height: auto;
42
+ margin: 2 0;
43
+ padding: 1;
44
+ border: hkey $border;
45
+ content-align: center middle;
46
+
47
+ & > * {
48
+ text-align: center;
49
+ }
50
+ }
51
+
52
+ #auth-title {
53
+ padding: 1 0;
54
+ text-style: bold;
55
+ color: $text-accent;
56
+ }
57
+
58
+ #content {
59
+ padding: 2;
60
+ height: auto;
61
+ }
62
+
63
+ #status {
64
+ padding: 1 0;
65
+ text-align: center;
66
+ }
67
+
68
+ #auth-url {
69
+ padding: 1;
70
+ border: solid $primary;
71
+ background: $surface;
72
+ text-align: center;
73
+ }
74
+
75
+ #actions {
76
+ padding: 1;
77
+ align: center middle;
78
+ }
79
+ """
80
+
81
+ BINDINGS = [
82
+ ("escape", "cancel", "Cancel"),
83
+ ]
84
+
85
+ def __init__(self) -> None:
86
+ super().__init__()
87
+ self.token: str | None = None
88
+ self.auth_url: str | None = None
89
+ self.poll_worker: Worker[None] | None = None
90
+
91
+ def compose(self) -> ComposeResult:
92
+ with Vertical(id="titlebox"):
93
+ yield Static("Shotgun Account Setup", id="auth-title")
94
+ yield Static(
95
+ "Authenticate with your Shotgun Account to get started",
96
+ id="auth-subtitle",
97
+ )
98
+
99
+ with Vertical(id="content"):
100
+ yield Label("Initializing...", id="status")
101
+ yield Markdown("", id="auth-url")
102
+ yield Markdown(
103
+ "**Instructions:**\n"
104
+ "1. A browser window will open automatically\n"
105
+ "2. Sign in or create a Shotgun Account\n"
106
+ "3. Complete payment if required\n"
107
+ "4. This window will automatically detect completion",
108
+ id="instructions",
109
+ )
110
+
111
+ with Vertical(id="actions"):
112
+ yield Button("Cancel", variant="default", id="cancel")
113
+
114
+ def on_mount(self) -> None:
115
+ """Start authentication flow when screen is mounted."""
116
+ self.run_worker(self._start_auth_flow(), exclusive=True)
117
+
118
+ def action_cancel(self) -> None:
119
+ """Cancel authentication and close screen."""
120
+ if self.poll_worker and self.poll_worker.state == WorkerState.RUNNING:
121
+ self.poll_worker.cancel()
122
+ self.dismiss(False)
123
+
124
+ @on(Button.Pressed, "#cancel")
125
+ def _on_cancel_pressed(self) -> None:
126
+ """Handle cancel button press."""
127
+ self.action_cancel()
128
+
129
+ @property
130
+ def config_manager(self) -> ConfigManager:
131
+ app = cast("ShotgunApp", self.app)
132
+ return app.config_manager
133
+
134
+ async def _start_auth_flow(self) -> None:
135
+ """Start the authentication flow."""
136
+ try:
137
+ # Get shotgun instance ID from config
138
+ shotgun_instance_id = self.config_manager.get_shotgun_instance_id()
139
+ logger.info("Starting auth flow with instance ID: %s", shotgun_instance_id)
140
+
141
+ # Update status
142
+ self.query_one("#status", Label).update(
143
+ "🔄 Creating authentication token..."
144
+ )
145
+
146
+ # Create unification token
147
+ client = ShotgunWebClient()
148
+ response = client.create_unification_token(shotgun_instance_id)
149
+
150
+ self.token = response.token
151
+ self.auth_url = response.auth_url
152
+
153
+ logger.info("Auth URL: %s", self.auth_url)
154
+
155
+ # Update UI with auth URL
156
+ self.query_one("#status", Label).update("✅ Authentication URL ready")
157
+ self.query_one("#auth-url", Markdown).update(
158
+ f"**Authentication URL:**\n\n[{self.auth_url}]({self.auth_url})"
159
+ )
160
+
161
+ # Try to open browser
162
+ try:
163
+ self.query_one("#status", Label).update("🌐 Opening browser...")
164
+ webbrowser.open(self.auth_url)
165
+ await asyncio.sleep(1)
166
+ self.query_one("#status", Label).update(
167
+ "⏳ Waiting for authentication... (opened in browser)"
168
+ )
169
+ except Exception as e:
170
+ logger.warning("Failed to open browser: %s", e)
171
+ self.query_one("#status", Label).update(
172
+ "⚠️ Please click the link above to authenticate"
173
+ )
174
+
175
+ # Start polling for status
176
+ self.poll_worker = self.run_worker(
177
+ self._poll_token_status(), exclusive=False
178
+ )
179
+
180
+ except httpx.HTTPError as e:
181
+ logger.error("Failed to create auth token: %s", e)
182
+ self.query_one("#status", Label).update(
183
+ f"❌ Error: Failed to create authentication token\n{e}"
184
+ )
185
+ self.notify("Failed to start authentication", severity="error")
186
+
187
+ except Exception as e:
188
+ logger.error("Unexpected error during auth flow: %s", e)
189
+ self.query_one("#status", Label).update(f"❌ Unexpected error: {e}")
190
+ self.notify("Authentication failed", severity="error")
191
+
192
+ async def _poll_token_status(self) -> None:
193
+ """Poll token status until completed or expired."""
194
+ if not self.token:
195
+ logger.error("No token available for polling")
196
+ return
197
+
198
+ client = ShotgunWebClient()
199
+ poll_count = 0
200
+ max_polls = 600 # 30 minutes with 3 second intervals
201
+
202
+ while poll_count < max_polls:
203
+ try:
204
+ await asyncio.sleep(DEFAULT_POLL_INTERVAL_SECONDS)
205
+ poll_count += 1
206
+
207
+ logger.debug(
208
+ "Polling token status (attempt %d/%d)", poll_count, max_polls
209
+ )
210
+
211
+ status_response = client.check_token_status(self.token)
212
+
213
+ if status_response.status == TokenStatus.COMPLETED:
214
+ # Success! Save keys and dismiss
215
+ logger.info("Authentication completed successfully")
216
+
217
+ if status_response.litellm_key and status_response.supabase_key:
218
+ self.config_manager.update_shotgun_account(
219
+ api_key=status_response.litellm_key,
220
+ supabase_jwt=status_response.supabase_key,
221
+ )
222
+
223
+ self.query_one("#status", Label).update(
224
+ "✅ Authentication successful! Saving credentials..."
225
+ )
226
+ await asyncio.sleep(1)
227
+ self.notify(
228
+ "Shotgun Account configured successfully!",
229
+ severity="information",
230
+ )
231
+ self.dismiss(True)
232
+ else:
233
+ logger.error("Completed but missing keys")
234
+ self.query_one("#status", Label).update(
235
+ "❌ Error: Authentication completed but keys are missing"
236
+ )
237
+ self.notify("Authentication failed", severity="error")
238
+ await asyncio.sleep(3)
239
+ self.dismiss(False)
240
+ return
241
+
242
+ elif status_response.status == TokenStatus.AWAITING_PAYMENT:
243
+ self.query_one("#status", Label).update(
244
+ "💳 Waiting for payment completion..."
245
+ )
246
+
247
+ elif status_response.status == TokenStatus.EXPIRED:
248
+ logger.error("Token expired")
249
+ self.query_one("#status", Label).update(
250
+ "❌ Authentication token expired (30 minutes)\n"
251
+ "Please try again."
252
+ )
253
+ self.notify("Authentication token expired", severity="error")
254
+ await asyncio.sleep(3)
255
+ self.dismiss(False)
256
+ return
257
+
258
+ elif status_response.status == TokenStatus.PENDING:
259
+ # Still waiting, update status message
260
+ elapsed_minutes = (poll_count * DEFAULT_POLL_INTERVAL_SECONDS) // 60
261
+ self.query_one("#status", Label).update(
262
+ f"⏳ Waiting for authentication... ({elapsed_minutes}m elapsed)"
263
+ )
264
+
265
+ except httpx.HTTPStatusError as e:
266
+ if e.response.status_code == 410:
267
+ # Token expired
268
+ logger.error("Token expired (410)")
269
+ self.query_one("#status", Label).update(
270
+ "❌ Authentication token expired"
271
+ )
272
+ self.notify("Authentication token expired", severity="error")
273
+ await asyncio.sleep(3)
274
+ self.dismiss(False)
275
+ return
276
+ else:
277
+ logger.error("HTTP error polling status: %s", e)
278
+ self.query_one("#status", Label).update(
279
+ f"❌ Error checking status: {e}"
280
+ )
281
+ await asyncio.sleep(5) # Wait a bit longer on error
282
+
283
+ except Exception as e:
284
+ logger.error("Error polling token status: %s", e)
285
+ self.query_one("#status", Label).update(f"⚠️ Error checking status: {e}")
286
+ await asyncio.sleep(5) # Wait a bit longer on error
287
+
288
+ # Timeout reached
289
+ logger.error("Polling timeout reached")
290
+ self.query_one("#status", Label).update(
291
+ "❌ Authentication timeout (30 minutes)\nPlease try again."
292
+ )
293
+ self.notify("Authentication timeout", severity="error")
294
+ await asyncio.sleep(3)
295
+ self.dismiss(False)
@@ -0,0 +1,176 @@
1
+ """Welcome screen for choosing between Shotgun Account and BYOK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING, cast
6
+
7
+ from textual import on
8
+ from textual.app import ComposeResult
9
+ from textual.containers import Container, Horizontal, Vertical
10
+ from textual.screen import Screen
11
+ from textual.widgets import Button, Markdown, Static
12
+
13
+ if TYPE_CHECKING:
14
+ from ..app import ShotgunApp
15
+
16
+
17
+ class WelcomeScreen(Screen[None]):
18
+ """Welcome screen for first-time setup."""
19
+
20
+ CSS = """
21
+ WelcomeScreen {
22
+ layout: vertical;
23
+ align: center middle;
24
+ }
25
+
26
+ #titlebox {
27
+ width: 100%;
28
+ height: auto;
29
+ margin: 2 0;
30
+ padding: 1;
31
+ border: hkey $border;
32
+ content-align: center middle;
33
+
34
+ & > * {
35
+ text-align: center;
36
+ }
37
+ }
38
+
39
+ #welcome-title {
40
+ padding: 1 0;
41
+ text-style: bold;
42
+ color: $text-accent;
43
+ }
44
+
45
+ #welcome-subtitle {
46
+ padding: 0 1;
47
+ }
48
+
49
+ #options-container {
50
+ width: 100%;
51
+ height: auto;
52
+ padding: 2;
53
+ align: center middle;
54
+ }
55
+
56
+ #options {
57
+ width: auto;
58
+ height: auto;
59
+ }
60
+
61
+ .option-box {
62
+ width: 45;
63
+ height: auto;
64
+ border: solid $primary;
65
+ padding: 2;
66
+ margin: 0 1;
67
+ background: $surface;
68
+ }
69
+
70
+ .option-box:focus-within {
71
+ border: solid $accent;
72
+ }
73
+
74
+ .option-title {
75
+ text-style: bold;
76
+ color: $text-accent;
77
+ padding: 0 0 1 0;
78
+ }
79
+
80
+ .option-benefits {
81
+ padding: 1 0;
82
+ }
83
+
84
+ .option-button {
85
+ margin: 1 0 0 0;
86
+ width: 100%;
87
+ }
88
+ """
89
+
90
+ BINDINGS = [
91
+ ("ctrl+c", "app.quit", "Quit"),
92
+ ]
93
+
94
+ def compose(self) -> ComposeResult:
95
+ with Vertical(id="titlebox"):
96
+ yield Static("Welcome to Shotgun", id="welcome-title")
97
+ yield Static(
98
+ "Choose how you'd like to get started",
99
+ id="welcome-subtitle",
100
+ )
101
+
102
+ with Container(id="options-container"):
103
+ with Horizontal(id="options"):
104
+ # Left box - Shotgun Account
105
+ with Vertical(classes="option-box", id="shotgun-box"):
106
+ yield Static("Use a Shotgun Account", classes="option-title")
107
+ yield Markdown(
108
+ "**Benefits:**\n"
109
+ "• Use of all models in the Model Garden\n"
110
+ "• We'll pick the optimal models to give you the best "
111
+ "experience for things like web search, codebase indexing",
112
+ classes="option-benefits",
113
+ )
114
+ yield Button(
115
+ "Sign Up for/Use your Shotgun Account",
116
+ variant="primary",
117
+ id="shotgun-button",
118
+ classes="option-button",
119
+ )
120
+
121
+ # Right box - BYOK
122
+ with Vertical(classes="option-box", id="byok-box"):
123
+ yield Static("Bring Your Own Key (BYOK)", classes="option-title")
124
+ yield Markdown(
125
+ "**Benefits:**\n"
126
+ "• 100% Supported by the application\n"
127
+ "• Use your existing API keys from OpenAI, Anthropic, or Google",
128
+ classes="option-benefits",
129
+ )
130
+ yield Button(
131
+ "Configure API Keys",
132
+ variant="success",
133
+ id="byok-button",
134
+ classes="option-button",
135
+ )
136
+
137
+ def on_mount(self) -> None:
138
+ """Focus the first button on mount."""
139
+ self.query_one("#shotgun-button", Button).focus()
140
+
141
+ @on(Button.Pressed, "#shotgun-button")
142
+ def _on_shotgun_pressed(self) -> None:
143
+ """Handle Shotgun Account button press."""
144
+ self.run_worker(self._start_shotgun_auth(), exclusive=True)
145
+
146
+ @on(Button.Pressed, "#byok-button")
147
+ def _on_byok_pressed(self) -> None:
148
+ """Handle BYOK button press."""
149
+ self._mark_welcome_shown()
150
+ # Push provider config screen before dismissing
151
+ from .provider_config import ProviderConfigScreen
152
+
153
+ self.app.push_screen(
154
+ ProviderConfigScreen(),
155
+ callback=lambda _arg: self.dismiss(),
156
+ )
157
+
158
+ async def _start_shotgun_auth(self) -> None:
159
+ """Launch Shotgun Account authentication flow."""
160
+ from .shotgun_auth import ShotgunAuthScreen
161
+
162
+ # Mark welcome screen as shown before auth
163
+ self._mark_welcome_shown()
164
+
165
+ # Push the auth screen and wait for result
166
+ await self.app.push_screen_wait(ShotgunAuthScreen())
167
+
168
+ # Dismiss welcome screen after auth
169
+ self.dismiss()
170
+
171
+ def _mark_welcome_shown(self) -> None:
172
+ """Mark the welcome screen as shown in config."""
173
+ app = cast("ShotgunApp", self.app)
174
+ config = app.config_manager.load()
175
+ config.shown_welcome_screen = True
176
+ app.config_manager.save(config)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shotgun-sh
3
- Version: 0.2.1.dev3
3
+ Version: 0.2.1.dev5
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
@@ -2,10 +2,10 @@ shotgun/__init__.py,sha256=P40K0fnIsb7SKcQrFnXZ4aREjpWchVDhvM1HxI4cyIQ,104
2
2
  shotgun/build_constants.py,sha256=RXNxMz46HaB5jucgMVpw8a2yCJqjbhTOh0PddyEVMN8,713
3
3
  shotgun/logging_config.py,sha256=UKenihvgH8OA3W0b8ZFcItYaFJVe9MlsMYlcevyW1HY,7440
4
4
  shotgun/main.py,sha256=RA3q1xPfqxCu43UmgI2ryZpA-IxPhJb_MJrbLqp9c_g,5140
5
- shotgun/posthog_telemetry.py,sha256=RGA_rgKxAnIofjkm-cLKzyuckAKz-861gpp97tk8IME,5949
5
+ shotgun/posthog_telemetry.py,sha256=TOiyBtLg21SttHGWKc4-e-PQgpbq6Uz_4OzlvlxMcZ0,6099
6
6
  shotgun/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- shotgun/sentry_telemetry.py,sha256=L7jFMNAnDIENWVeQYSLpyul2nmIm2w3wnOp2kDP_cic,2902
8
- shotgun/telemetry.py,sha256=Ves6Ih3hshpKVNVAUUmwRdtW8NkTjFPg8hEqvFKZ0t0,3208
7
+ shotgun/sentry_telemetry.py,sha256=VD8es-tREfgtRKhDsEVvqpo0_kM_ab6iVm2lkOEmTlI,2950
8
+ shotgun/telemetry.py,sha256=WfxdHALh5_51nw783ZZvD-LEyC6ypHxSUTMXUioZhTQ,3339
9
9
  shotgun/agents/__init__.py,sha256=8Jzv1YsDuLyNPFJyckSr_qI4ehTVeDyIMDW4omsfPGc,25
10
10
  shotgun/agents/agent_manager.py,sha256=xq8L0oAFgtFCpKVsyUoMtYJqUyz5XxjWLKNnxoe1zo4,26577
11
11
  shotgun/agents/common.py,sha256=Hr9HigsDopkI0Sr3FThGDv1f67NLemOjcYA6LV9v970,18963
@@ -21,10 +21,10 @@ shotgun/agents/specify.py,sha256=7MoMxfIn34G27mw6wrp_F0i2O5rid476L3kHFONDCd0,313
21
21
  shotgun/agents/tasks.py,sha256=nk8zIl24o01hfzOGyWSbeVWeke6OGseO4Ppciurh13U,2999
22
22
  shotgun/agents/usage_manager.py,sha256=5d9JC4_cthXwhTSytMfMExMDAUYp8_nkPepTJZXk13w,5017
23
23
  shotgun/agents/config/__init__.py,sha256=Fl8K_81zBpm-OfOW27M_WWLSFdaHHek6lWz95iDREjQ,318
24
- shotgun/agents/config/constants.py,sha256=I3f0ueoQaTg5HddXGCYimCYpj-U57z3IBQYIVJxVIhg,872
25
- shotgun/agents/config/manager.py,sha256=6WT4xaAfJTyYxpQ9AcMYHG1cjySNmtJDgTzVmqIAMpc,14503
26
- shotgun/agents/config/models.py,sha256=ZojhfheNO337e1icy_cE2PpBXIl5oHkdajr4azzFF-U,5106
27
- shotgun/agents/config/provider.py,sha256=_HkmN4WhGcZgtAuaF-RA6ZEOiWQ0oWLufZDxl-3rnn4,10935
24
+ shotgun/agents/config/constants.py,sha256=JNuLpeBUKikEsxGSjwX3RVWUQpbCKnDKstF2NczuDqk,932
25
+ shotgun/agents/config/manager.py,sha256=e1HjGWKN1l9jDmK5MG8cZ6UMeWq6MntVv0NfETIgSO8,17577
26
+ shotgun/agents/config/models.py,sha256=ohLXt9niCy4uFfFP1E6WSBZtxh7aZ16gTA2S3pHYkmc,5431
27
+ shotgun/agents/config/provider.py,sha256=TwwZC_BtYSOpN2jdX6WZdor29EnAqfMoQK5GmNEYaPI,11012
28
28
  shotgun/agents/history/__init__.py,sha256=XFQj2a6fxDqVg0Q3juvN9RjV_RJbgvFZtQOCOjVJyp4,147
29
29
  shotgun/agents/history/compaction.py,sha256=9RMpG0aY_7L4TecbgwHSOkGtbd9W5XZTg-MbzZmNl00,3515
30
30
  shotgun/agents/history/constants.py,sha256=yWY8rrTZarLA3flCCMB_hS2NMvUDRDTwP4D4j7MIh1w,446
@@ -56,9 +56,9 @@ shotgun/agents/tools/web_search/gemini.py,sha256=-fI_deaBT4-_61A7KlKtz8tmKXW50fV
56
56
  shotgun/agents/tools/web_search/openai.py,sha256=pnIcTV3vwXJQuxPs4I7gQNX18XzM7D7FqeNxnn1E7yw,3437
57
57
  shotgun/agents/tools/web_search/utils.py,sha256=GLJ5QV9bT2ubFMuFN7caMN7tK9OTJ0R3GD57B-tCMF0,532
58
58
  shotgun/cli/__init__.py,sha256=_F1uW2g87y4bGFxz8Gp8u7mq2voHp8vQIUtCmm8Tojo,40
59
- shotgun/cli/config.py,sha256=Lrcqxm7W7I6g6iP_K5-yK7QFOgcYt5KIc8A6Wit1Ksg,7835
59
+ shotgun/cli/config.py,sha256=lT_zXwui-Wv3hewjebQeu9eLwK3tYn1wla5vKit6eqs,7931
60
60
  shotgun/cli/export.py,sha256=3hIwK2_OM1MFYSTfzBxsGuuBGm5fo0XdxASfQ5Uqb3Y,2471
61
- shotgun/cli/feedback.py,sha256=Me1dQQgkYwP4AIFwYgfHcPXxFdJ6CzFbCBttKcFd2Q0,1238
61
+ shotgun/cli/feedback.py,sha256=K8iFDl5051_g95jwDEm9gdKUjDWO8HBVZjlRN8uD7Mk,1300
62
62
  shotgun/cli/models.py,sha256=kwZEldQWUheNsqF_ezgDzRBc6h0Y0JxFw1VMQjZlvPE,182
63
63
  shotgun/cli/plan.py,sha256=T-eu-I9z-dSoKqJ-KI8X5i5Mm0VL1BfornxRiUjTgnk,2324
64
64
  shotgun/cli/research.py,sha256=qvBBtX3Wyn6pDZlJpcEvbeK-0iTOXegi71tm8HKVYaE,2490
@@ -76,7 +76,7 @@ shotgun/codebase/core/__init__.py,sha256=GWWhJEqChiDXAF4omYCgzgoZmJjwsAf6P1aZ5Bl
76
76
  shotgun/codebase/core/change_detector.py,sha256=kWCYLWzRzb3IGGOj71KBn7UOCOKMpINJbOBDf98aMxE,12409
77
77
  shotgun/codebase/core/code_retrieval.py,sha256=_JVyyQKHDFm3dxOOua1mw9eIIOHIVz3-I8aZtEsEj1E,7927
78
78
  shotgun/codebase/core/cypher_models.py,sha256=Yfysfa9lLguILftkmtuJCN3kLBFIo7WW7NigM-Zr-W4,1735
79
- shotgun/codebase/core/ingestor.py,sha256=yh6BEIuUUfXU3dVpP0Llk19SrxA-uo3pdGnfcQsDsSo,63368
79
+ shotgun/codebase/core/ingestor.py,sha256=t155uP97Sav3g0_wfEEpNsJ46PwD125OLuRmHbSVkdk,63858
80
80
  shotgun/codebase/core/language_config.py,sha256=vsqHyuFnumRPRBV1lMOxWKNOIiClO6FyfKQR0fGrtl4,8934
81
81
  shotgun/codebase/core/manager.py,sha256=USGLBdDUoFtq6fMFWRtUu2HBC_FI8d6lWcAV4l6fcvk,66000
82
82
  shotgun/codebase/core/nl_query.py,sha256=kPoSJXBlm5rLhzOofZhqPVMJ_Lj3rV2H6sld6BwtMdg,16115
@@ -113,8 +113,12 @@ shotgun/sdk/codebase.py,sha256=7doUvwwl27RDJZIbP56LQsAx26GANtAKEBptTUhLT6w,8842
113
113
  shotgun/sdk/exceptions.py,sha256=qBcQv0v7ZTwP7CMcxZST4GqCsfOWtOUjSzGBo0-heqo,412
114
114
  shotgun/sdk/models.py,sha256=X9nOTUHH0cdkQW1NfnMEDu-QgK9oUsEISh1Jtwr5Am4,5496
115
115
  shotgun/sdk/services.py,sha256=J4PJFSxCQ6--u7rb3Ta-9eYtlYcxcbnzrMP6ThyCnw4,705
116
+ shotgun/shotgun_web/__init__.py,sha256=IB-TvK3WvLNrdKH0j9MwMGtIjqi81ASFIVwaZa0ifNg,461
117
+ shotgun/shotgun_web/client.py,sha256=n5DDuVfSa6VPZjhSsfSxQlSFOnhgDHyidRnB8Hv9XF4,4134
118
+ shotgun/shotgun_web/constants.py,sha256=b1pwWr9l__3fVex6EUx8Z0fBO3jkzvr9gDdZK9_0jik,553
119
+ shotgun/shotgun_web/models.py,sha256=Ie9VfqKZM2tIJhIjentU9qLoNaMZvnUJaIu-xg9kQsA,1391
116
120
  shotgun/tui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
- shotgun/tui/app.py,sha256=DrULqhxPPDZzz1WQNjXDY_cls4kXJNexYlI1ISrNTKs,5089
121
+ shotgun/tui/app.py,sha256=bWs0GVJzXb6ZdANDi0qw1xtOAuVaCX6Xgb-ziNi5kVg,5753
118
122
  shotgun/tui/filtered_codebase_service.py,sha256=lJ8gTMhIveTatmvmGLP299msWWTkVYKwvY_2FhuL2s4,1687
119
123
  shotgun/tui/styles.tcss,sha256=ETyyw1bpMBOqTi5RLcAJUScdPWTvAWEqE9YcT0kVs_E,121
120
124
  shotgun/tui/commands/__init__.py,sha256=8D5lvtpqMW5-fF7Bg3oJtUzU75cKOv6aUaHYYszydU8,2518
@@ -125,12 +129,14 @@ shotgun/tui/components/vertical_tail.py,sha256=kROwTaRjUwVB7H35dtmNcUVPQqNYvvfq7
125
129
  shotgun/tui/screens/chat.py,sha256=CqAv_x6R4zl-MGbtg8KgZWt8OhpBJYpx5gGBQ3oxqgw,30313
126
130
  shotgun/tui/screens/chat.tcss,sha256=2Yq3E23jxsySYsgZf4G1AYrYVcpX0UDW6kNNI0tDmtM,437
127
131
  shotgun/tui/screens/directory_setup.py,sha256=lIZ1J4A6g5Q2ZBX8epW7BhR96Dmdcg22CyiM5S-I5WU,3237
128
- shotgun/tui/screens/feedback.py,sha256=cYtmuM3qqKwevstu8gJ9mmk7lkIKZvfAyDEBUOLh-yI,5660
129
- shotgun/tui/screens/model_picker.py,sha256=ZutEz4w_BJkGGwwdJSj7-kPdIPzmK6ZDHYkEA0q596A,8625
130
- shotgun/tui/screens/provider_config.py,sha256=pDJKjvl_els-XrbRTwBBDDL0jo_uRa7DMTAZJAJ9NXA,8461
132
+ shotgun/tui/screens/feedback.py,sha256=VxpW0PVxMp22ZvSfQkTtgixNrpEOlfWtekjqlVfYEjA,5708
133
+ shotgun/tui/screens/model_picker.py,sha256=G-EvalpxgHKk0W3FgHMcxIr817VwZyEgh_ZadSQiRwo,11831
134
+ shotgun/tui/screens/provider_config.py,sha256=s3SA13BJsV_Ge5lXdd4nOtbhCMjBPKqNOGaN20uMRBA,11069
135
+ shotgun/tui/screens/shotgun_auth.py,sha256=Y--7LZewV6gfDkucxymfAO7BCd7eI2C3H1ClDMztVio,10663
131
136
  shotgun/tui/screens/splash.py,sha256=E2MsJihi3c9NY1L28o_MstDxGwrCnnV7zdq00MrGAsw,706
137
+ shotgun/tui/screens/welcome.py,sha256=cpsBK2Gy99Nz7rwZhxVn310G68TjSdGXpIXGRp7DoLY,5329
132
138
  shotgun/tui/screens/chat_screen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
133
- shotgun/tui/screens/chat_screen/command_providers.py,sha256=qAY09_pKxcTyxJHy9Rlwhs1tAW5QMWXxDwnpparnQmI,12542
139
+ shotgun/tui/screens/chat_screen/command_providers.py,sha256=7Xnxd4k30bpLOMZSX32bcugU4IgpqU4Y8f6eHWKXd4o,12694
134
140
  shotgun/tui/screens/chat_screen/hint_message.py,sha256=WOpbk8q7qt7eOHTyyHvh_IQIaublVDeJGaLpsxEk9FA,933
135
141
  shotgun/tui/screens/chat_screen/history.py,sha256=Go859iEjw0s5aELKpF42MjLXy7UFQ52XnJMTIkV3aLo,12406
136
142
  shotgun/tui/utils/__init__.py,sha256=cFjDfoXTRBq29wgP7TGRWUu1eFfiIG-LLOzjIGfadgI,150
@@ -140,8 +146,8 @@ shotgun/utils/env_utils.py,sha256=5spVCdeqVKtlWoKocPhz_5j_iRN30neqcGUzUuiWmfc,13
140
146
  shotgun/utils/file_system_utils.py,sha256=l-0p1bEHF34OU19MahnRFdClHufThfGAjQ431teAIp0,1004
141
147
  shotgun/utils/source_detection.py,sha256=Co6Q03R3fT771TF3RzB-70stfjNP2S4F_ArZKibwzm8,454
142
148
  shotgun/utils/update_checker.py,sha256=IgzPHRhS1ETH7PnJR_dIx6lxgr1qHpCkMTgzUxvGjhI,7586
143
- shotgun_sh-0.2.1.dev3.dist-info/METADATA,sha256=f_1fWjFpf7SbFyTIidsUTAgsu4wQSTn2QrH_3fE9ibA,11226
144
- shotgun_sh-0.2.1.dev3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
145
- shotgun_sh-0.2.1.dev3.dist-info/entry_points.txt,sha256=asZxLU4QILneq0MWW10saVCZc4VWhZfb0wFZvERnzfA,45
146
- shotgun_sh-0.2.1.dev3.dist-info/licenses/LICENSE,sha256=YebsZl590zCHrF_acCU5pmNt0pnAfD2DmAnevJPB1tY,1065
147
- shotgun_sh-0.2.1.dev3.dist-info/RECORD,,
149
+ shotgun_sh-0.2.1.dev5.dist-info/METADATA,sha256=0ezWAgZvBCY1TexJSP49BbwJOUJXbl-NDwNX1n8TFcc,11226
150
+ shotgun_sh-0.2.1.dev5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
151
+ shotgun_sh-0.2.1.dev5.dist-info/entry_points.txt,sha256=asZxLU4QILneq0MWW10saVCZc4VWhZfb0wFZvERnzfA,45
152
+ shotgun_sh-0.2.1.dev5.dist-info/licenses/LICENSE,sha256=YebsZl590zCHrF_acCU5pmNt0pnAfD2DmAnevJPB1tY,1065
153
+ shotgun_sh-0.2.1.dev5.dist-info/RECORD,,