chatsbom 0.2.7__py3-none-any.whl → 0.2.8__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.
chatsbom/commands/chat.py CHANGED
@@ -2,6 +2,7 @@
2
2
  import asyncio
3
3
  import json
4
4
  import os
5
+ from contextlib import suppress
5
6
  from dataclasses import dataclass
6
7
  from dataclasses import field
7
8
  from datetime import datetime
@@ -127,6 +128,12 @@ class ChatSBOMApp(App):
127
128
  self._update_status()
128
129
 
129
130
  async def on_mount(self) -> None:
131
+ """Initialize the Claude Agent SDK client."""
132
+ import tempfile
133
+ stderr_file = tempfile.NamedTemporaryFile(
134
+ mode='w', delete=False, suffix='.log',
135
+ )
136
+
130
137
  opts = ClaudeAgentOptions(
131
138
  disallowed_tools=[
132
139
  'Read', 'Write', 'Edit',
@@ -139,9 +146,24 @@ class ChatSBOMApp(App):
139
146
  ),
140
147
  },
141
148
  system_prompt=SYSTEM_PROMPT,
149
+ env={
150
+ k: v for k, v in [
151
+ ('ANTHROPIC_BASE_URL', os.getenv('ANTHROPIC_BASE_URL')),
152
+ ] if v
153
+ },
154
+ debug_stderr=stderr_file,
142
155
  )
156
+
143
157
  self.client = ClaudeSDKClient(options=opts)
144
- await self.client.__aenter__()
158
+ try:
159
+ await self.client.__aenter__()
160
+ except Exception as e:
161
+ self._handle_init_error(e, stderr_file.name)
162
+ raise
163
+ finally:
164
+ stderr_file.close()
165
+ with suppress(OSError):
166
+ os.unlink(stderr_file.name)
145
167
 
146
168
  log = self.query_one('#log', RichLog)
147
169
  log.write('[bold green]ChatSBOM Agent[/] - Query examples:')
@@ -150,6 +172,33 @@ class ChatSBOMApp(App):
150
172
  self.query_one('#loading').add_class('hidden')
151
173
  self._update_status()
152
174
 
175
+ def _handle_init_error(self, error: Exception, stderr_path: str) -> None:
176
+ """Display initialization error with context."""
177
+ from rich.console import Console
178
+ from rich.panel import Panel
179
+ from pathlib import Path
180
+
181
+ lines = [
182
+ f'[red]{error}[/red]',
183
+ f'[dim]{type(error).__name__}[/dim]',
184
+ ]
185
+
186
+ if stderr := Path(stderr_path).read_text().strip():
187
+ lines += ['', '[yellow]stderr:[/yellow]', f'[dim]{stderr}[/dim]']
188
+
189
+ if os.geteuid() == 0:
190
+ lines += ['', '[yellow]⚠ Cannot use bypassPermissions as root. Run as non-root user.[/yellow]']
191
+
192
+ if url := os.getenv('ANTHROPIC_BASE_URL'):
193
+ lines += ['', f'[dim]API: {url}[/dim]']
194
+
195
+ Console().print(
196
+ Panel(
197
+ '\n'.join(lines),
198
+ title='[red]Init Failed[/red]', border_style='red',
199
+ ),
200
+ )
201
+
153
202
  async def on_unmount(self) -> None:
154
203
  if self.client:
155
204
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chatsbom
3
- Version: 0.2.7
3
+ Version: 0.2.8
4
4
  Summary: ChatSBOM - Talk to your Supply Chain. Chat with SBOMs.
5
5
  Requires-Python: >=3.12
6
6
  Requires-Dist: claude-agent-sdk>=0.1.0
@@ -2,7 +2,7 @@ chatsbom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  chatsbom/__main__.py,sha256=QVs4sO1YUqJt642_Gw4wyiDBwQ5YeL4I9v_xEDkTPdM,1228
3
3
  chatsbom/__version__.py,sha256=JodF7HbCCwUPFhWltShEeNCAWHPTwRcPvSm7qWfMTCQ,411
4
4
  chatsbom/commands/__init__.py,sha256=vOL_QwoyFQhEIfs-rf0LVieAjStfkqlhqkjaZ_1p7gQ,15
5
- chatsbom/commands/chat.py,sha256=_X0bgXKIKTLAR-UKry0guCeRtnh08Bou5io5sTnYHBc,11236
5
+ chatsbom/commands/chat.py,sha256=jmToyhbg_yoKgX-yRf60Gl3u4oy00A1BzQDO0ktVoi8,12835
6
6
  chatsbom/commands/collect.py,sha256=ApweQztO889o4X4lBrxlIwdYorDUSiE01M4-XMO0HUM,16536
7
7
  chatsbom/commands/convert.py,sha256=etc6s_tT4VAvjOCZs8dnHppbTYEeAHI6kHJikkUWD64,8249
8
8
  chatsbom/commands/download.py,sha256=I9TwEXO1zrh9-DwvUUMh4iZ1W5ZCXbtE4jcJiK2KqnY,10218
@@ -19,7 +19,7 @@ chatsbom/core/validation.py,sha256=v4boiht4hK73nuZNYpzLTkZKsNSoFPMUDIX-8sP2E9g,3
19
19
  chatsbom/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  chatsbom/models/framework.py,sha256=Whlsbnn64YwftMifMEMVvhsWADC9uupBV4QN1i1BoNQ,2833
21
21
  chatsbom/models/language.py,sha256=RgbBQZfG630uNZ7w-BtB1LZ5B5Q_nEExGrwUadfpRqE,3601
22
- chatsbom-0.2.7.dist-info/METADATA,sha256=--56Qd-BYDIvcJIvbypG5jGM8Hch2Zd0XcnRn6LDaCY,4115
23
- chatsbom-0.2.7.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
24
- chatsbom-0.2.7.dist-info/entry_points.txt,sha256=906Ig6u2FwWk3ftNi4mth03N1NRgP4-B2p9kpppcqWA,51
25
- chatsbom-0.2.7.dist-info/RECORD,,
22
+ chatsbom-0.2.8.dist-info/METADATA,sha256=ySw9ndHHKi56MpsCgDkF-C735wy6oME9-JDAlabA9F0,4115
23
+ chatsbom-0.2.8.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
24
+ chatsbom-0.2.8.dist-info/entry_points.txt,sha256=906Ig6u2FwWk3ftNi4mth03N1NRgP4-B2p9kpppcqWA,51
25
+ chatsbom-0.2.8.dist-info/RECORD,,