code-puppy 0.0.206__py3-none-any.whl → 0.0.208__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.
@@ -16,9 +16,7 @@ class CReviewerAgent(BaseAgent):
16
16
 
17
17
  @property
18
18
  def description(self) -> str:
19
- return (
20
- "Hardcore C systems reviewer obsessed with determinism, perf, and safety"
21
- )
19
+ return "Hardcore C systems reviewer obsessed with determinism, perf, and safety"
22
20
 
23
21
  def get_available_tools(self) -> list[str]:
24
22
  """Reviewers only need read-only inspection helpers."""
@@ -67,9 +67,15 @@ def _is_process_alive(pid: int) -> bool:
67
67
 
68
68
  PROCESS_QUERY_LIMITED_INFORMATION = 0x1000
69
69
  kernel32 = ctypes.windll.kernel32 # type: ignore[attr-defined]
70
- kernel32.OpenProcess.argtypes = [wintypes.DWORD, wintypes.BOOL, wintypes.DWORD]
70
+ kernel32.OpenProcess.argtypes = [
71
+ wintypes.DWORD,
72
+ wintypes.BOOL,
73
+ wintypes.DWORD,
74
+ ]
71
75
  kernel32.OpenProcess.restype = wintypes.HANDLE
72
- handle = kernel32.OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, False, int(pid))
76
+ handle = kernel32.OpenProcess(
77
+ PROCESS_QUERY_LIMITED_INFORMATION, False, int(pid)
78
+ )
73
79
  if handle:
74
80
  kernel32.CloseHandle(handle)
75
81
  return True
@@ -928,7 +928,9 @@ class BaseAgent(ABC):
928
928
  """
929
929
  group_id = str(uuid.uuid4())
930
930
  # Avoid double-loading: reuse existing agent if already built
931
- pydantic_agent = self._code_generation_agent or self.reload_code_generation_agent()
931
+ pydantic_agent = (
932
+ self._code_generation_agent or self.reload_code_generation_agent()
933
+ )
932
934
 
933
935
  # Build combined prompt payload when attachments are provided.
934
936
  attachment_parts: List[Any] = []
@@ -33,7 +33,10 @@ def get_commands_help():
33
33
  ("/exit, /quit", "Exit interactive mode"),
34
34
  ("/generate-pr-description [@dir]", "Generate comprehensive PR description"),
35
35
  ("/model, /m <model>", "Set active model"),
36
- ("/reasoning <low|medium|high>", "Set OpenAI reasoning effort for GPT-5 models"),
36
+ (
37
+ "/reasoning <low|medium|high>",
38
+ "Set OpenAI reasoning effort for GPT-5 models",
39
+ ),
37
40
  ("/pin_model <agent> <model>", "Pin a specific model to an agent"),
38
41
  ("/mcp", "Manage MCP servers (list, start, stop, status, etc.)"),
39
42
  ("/motd", "Show the latest message of the day (MOTD)"),
@@ -134,6 +137,7 @@ def _ensure_plugins_loaded() -> None:
134
137
 
135
138
  def handle_command(command: str):
136
139
  from code_puppy.messaging import emit_error, emit_info, emit_success, emit_warning
140
+
137
141
  _ensure_plugins_loaded()
138
142
 
139
143
  """
@@ -318,6 +322,7 @@ def handle_command(command: str):
318
322
  get_current_autosave_session_name,
319
323
  rotate_autosave_id,
320
324
  )
325
+
321
326
  if len(tokens) == 1 or tokens[1] == "id":
322
327
  sid = get_current_autosave_id()
323
328
  emit_info(
@@ -619,9 +624,7 @@ def handle_command(command: str):
619
624
  if is_json_agent and hasattr(current_agent, "refresh_config"):
620
625
  current_agent.refresh_config()
621
626
  current_agent.reload_code_generation_agent()
622
- emit_info(
623
- f"Active agent reloaded with pinned model '{model_name}'"
624
- )
627
+ emit_info(f"Active agent reloaded with pinned model '{model_name}'")
625
628
  except Exception as reload_error:
626
629
  emit_warning(
627
630
  f"Pinned model applied but reload failed: {reload_error}"
@@ -733,6 +736,7 @@ def handle_command(command: str):
733
736
  # Rotate autosave id to avoid overwriting any existing autosave
734
737
  try:
735
738
  from code_puppy.config import rotate_autosave_id
739
+
736
740
  new_id = rotate_autosave_id()
737
741
  autosave_info = f"\n[dim]Autosave session rotated to: {new_id}[/dim]"
738
742
  except Exception:
code_puppy/config.py CHANGED
@@ -697,7 +697,7 @@ def get_auto_save_session() -> bool:
697
697
 
698
698
  def set_auto_save_session(enabled: bool):
699
699
  """Sets the auto_save_session configuration value.
700
-
700
+
701
701
  Args:
702
702
  enabled: Whether to enable auto-saving of sessions
703
703
  """
@@ -721,7 +721,7 @@ def get_max_saved_sessions() -> int:
721
721
 
722
722
  def set_max_saved_sessions(max_sessions: int):
723
723
  """Sets the max_saved_sessions configuration value.
724
-
724
+
725
725
  Args:
726
726
  max_sessions: Maximum number of sessions to keep (0 for unlimited)
727
727
  """
@@ -733,14 +733,14 @@ def get_current_autosave_id() -> str:
733
733
  global _CURRENT_AUTOSAVE_ID
734
734
  if not _CURRENT_AUTOSAVE_ID:
735
735
  # Use a full timestamp so tests and UX can predict the name if needed
736
- _CURRENT_AUTOSAVE_ID = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
736
+ _CURRENT_AUTOSAVE_ID = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
737
737
  return _CURRENT_AUTOSAVE_ID
738
738
 
739
739
 
740
740
  def rotate_autosave_id() -> str:
741
741
  """Force a new autosave session ID and return it."""
742
742
  global _CURRENT_AUTOSAVE_ID
743
- _CURRENT_AUTOSAVE_ID = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
743
+ _CURRENT_AUTOSAVE_ID = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
744
744
  return _CURRENT_AUTOSAVE_ID
745
745
 
746
746
 
@@ -758,7 +758,7 @@ def set_current_autosave_from_session_name(session_name: str) -> str:
758
758
  global _CURRENT_AUTOSAVE_ID
759
759
  prefix = "auto_session_"
760
760
  if session_name.startswith(prefix):
761
- _CURRENT_AUTOSAVE_ID = session_name[len(prefix):]
761
+ _CURRENT_AUTOSAVE_ID = session_name[len(prefix) :]
762
762
  else:
763
763
  _CURRENT_AUTOSAVE_ID = session_name
764
764
  return _CURRENT_AUTOSAVE_ID
code_puppy/main.py CHANGED
@@ -175,15 +175,22 @@ async def main():
175
175
 
176
176
  # Handle agent selection from command line
177
177
  if args.agent:
178
- from code_puppy.agents.agent_manager import set_current_agent, get_available_agents
178
+ from code_puppy.agents.agent_manager import (
179
+ set_current_agent,
180
+ get_available_agents,
181
+ )
179
182
 
180
183
  agent_name = args.agent.lower()
181
184
  try:
182
185
  # First check if the agent exists by getting available agents
183
186
  available_agents = get_available_agents()
184
187
  if agent_name not in available_agents:
185
- emit_system_message(f"[bold red]Error:[/bold red] Agent '{agent_name}' not found")
186
- emit_system_message(f"Available agents: {', '.join(available_agents.keys())}")
188
+ emit_system_message(
189
+ f"[bold red]Error:[/bold red] Agent '{agent_name}' not found"
190
+ )
191
+ emit_system_message(
192
+ f"Available agents: {', '.join(available_agents.keys())}"
193
+ )
187
194
  sys.exit(1)
188
195
 
189
196
  # Agent exists, set it
@@ -192,7 +199,7 @@ async def main():
192
199
  except Exception as e:
193
200
  emit_system_message(f"[bold red]Error setting agent:[/bold red] {str(e)}")
194
201
  sys.exit(1)
195
-
202
+
196
203
  current_version = __version__
197
204
 
198
205
  no_version_update = os.getenv("NO_VERSION_UPDATE", "").lower() in (
@@ -291,7 +298,6 @@ async def interactive_mode(message_renderer, initial_command: str = None) -> Non
291
298
 
292
299
  emit_info("[bold cyan]Initializing agent...[/bold cyan]")
293
300
 
294
-
295
301
  # Initialize the runtime agent manager
296
302
  if initial_command:
297
303
  from code_puppy.agents import get_current_agent
@@ -405,7 +411,11 @@ async def interactive_mode(message_renderer, initial_command: str = None) -> Non
405
411
 
406
412
  # Check for clear command (supports both `clear` and `/clear`)
407
413
  if task.strip().lower() in ("clear", "/clear"):
408
- from code_puppy.messaging import emit_info, emit_system_message, emit_warning
414
+ from code_puppy.messaging import (
415
+ emit_info,
416
+ emit_system_message,
417
+ emit_warning,
418
+ )
409
419
 
410
420
  agent = get_current_agent()
411
421
  new_session_id = finalize_autosave_session()
@@ -425,6 +435,7 @@ async def interactive_mode(message_renderer, initial_command: str = None) -> Non
425
435
  command_result = handle_command(cleaned_for_commands)
426
436
  except Exception as e:
427
437
  from code_puppy.messaging import emit_error
438
+
428
439
  emit_error(f"Command error: {e}")
429
440
  # Continue interactive loop instead of exiting
430
441
  continue
@@ -465,13 +476,14 @@ async def interactive_mode(message_renderer, initial_command: str = None) -> Non
465
476
 
466
477
  # Auto-save session if enabled
467
478
  from code_puppy.config import auto_save_session_if_enabled
479
+
468
480
  auto_save_session_if_enabled()
469
481
 
470
482
  # Ensure console output is flushed before next prompt
471
483
  # This fixes the issue where prompt doesn't appear after agent response
472
484
  display_console.file.flush() if hasattr(
473
485
  display_console.file, "flush"
474
- ) else None
486
+ ) else None
475
487
  import time
476
488
 
477
489
  time.sleep(0.1) # Brief pause to ensure all messages are rendered
@@ -655,4 +667,4 @@ def main_entry():
655
667
 
656
668
 
657
669
  if __name__ == "__main__":
658
- main_entry()
670
+ main_entry()
@@ -92,6 +92,4 @@ class SpinnerBase(ABC):
92
92
  if capacity <= 0:
93
93
  return ""
94
94
  proportion_pct = proportion * 100
95
- return (
96
- f"Tokens: {total_tokens:,}/{capacity:,} ({proportion_pct:.1f}% used)"
97
- )
95
+ return f"Tokens: {total_tokens:,}/{capacity:,} ({proportion_pct:.1f}% used)"
@@ -33,7 +33,7 @@ from .round_robin_model import RoundRobinModel
33
33
 
34
34
  class ZaiChatModel(OpenAIChatModel):
35
35
  def _process_response(self, response):
36
- response.object = 'chat.completion'
36
+ response.object = "chat.completion"
37
37
  return super()._process_response(response)
38
38
 
39
39
 
@@ -248,18 +248,18 @@ class ModelFactory:
248
248
  zai_model = ZaiChatModel(
249
249
  model_name=model_config["name"],
250
250
  provider=OpenAIProvider(
251
- api_key=os.getenv('ZAI_API_KEY'),
252
- base_url='https://api.z.ai/api/coding/paas/v4'
253
- )
251
+ api_key=os.getenv("ZAI_API_KEY"),
252
+ base_url="https://api.z.ai/api/coding/paas/v4",
253
+ ),
254
254
  )
255
255
  return zai_model
256
256
  elif model_type == "zai_api":
257
257
  zai_model = ZaiChatModel(
258
258
  model_name=model_config["name"],
259
259
  provider=OpenAIProvider(
260
- api_key=os.getenv('ZAI_API_KEY'),
261
- base_url='https://api.z.ai/api/paas/v4/'
262
- )
260
+ api_key=os.getenv("ZAI_API_KEY"),
261
+ base_url="https://api.z.ai/api/paas/v4/",
262
+ ),
263
263
  )
264
264
  return zai_model
265
265
  elif model_type == "custom_gemini":
code_puppy/models.json CHANGED
@@ -4,6 +4,42 @@
4
4
  "name": "gpt-5",
5
5
  "context_length": 400000
6
6
  },
7
+ "synthetic-DeepSeek-V3.1-Terminus": {
8
+ "type": "custom_openai",
9
+ "name": "hf:deepseek-ai/DeepSeek-V3.1-Terminus",
10
+ "custom_endpoint": {
11
+ "url": "https://api.synthetic.new/openai/v1/",
12
+ "api_key": "$SYN_API_KEY"
13
+ },
14
+ "context_length": 128000
15
+ },
16
+ "synthetic-Kimi-K2-Instruct-0905": {
17
+ "type": "custom_openai",
18
+ "name": "hf:moonshotai/Kimi-K2-Instruct-0905",
19
+ "custom_endpoint": {
20
+ "url": "https://api.synthetic.new/openai/v1/",
21
+ "api_key": "$SYN_API_KEY"
22
+ },
23
+ "context_length": 256000
24
+ },
25
+ "synthetic-Qwen3-Coder-480B-A35B-Instruct": {
26
+ "type": "custom_openai",
27
+ "name": "hf:Qwen/Qwen3-Coder-480B-A35B-Instruct",
28
+ "custom_endpoint": {
29
+ "url": "https://api.synthetic.new/openai/v1/",
30
+ "api_key": "$SYN_API_KEY"
31
+ },
32
+ "context_length": 256000
33
+ },
34
+ "synthetic-GLM-4.6": {
35
+ "type": "custom_openai",
36
+ "name": "hf:zai-org/GLM-4.6",
37
+ "custom_endpoint": {
38
+ "url": "https://api.synthetic.new/openai/v1/",
39
+ "api_key": "$SYN_API_KEY"
40
+ },
41
+ "context_length": 200000
42
+ },
7
43
  "Cerebras-Qwen3-Coder-480b": {
8
44
  "type": "cerebras",
9
45
  "name": "qwen-3-coder-480b",
@@ -190,7 +190,9 @@ async def restore_autosave_interactively(base_dir: Path) -> None:
190
190
  for idx, (name, timestamp, message_count) in enumerate(page_entries, start=1):
191
191
  timestamp_display = timestamp or "unknown time"
192
192
  message_display = (
193
- f"{message_count} messages" if message_count is not None else "unknown size"
193
+ f"{message_count} messages"
194
+ if message_count is not None
195
+ else "unknown size"
194
196
  )
195
197
  emit_system_message(
196
198
  f" [{idx}] {name} ({message_display}, saved at {timestamp_display})"
@@ -200,7 +202,9 @@ async def restore_autosave_interactively(base_dir: Path) -> None:
200
202
  page_count = (total + PAGE_SIZE - 1) // PAGE_SIZE
201
203
  is_last_page = (page + 1) >= page_count
202
204
  remaining = total - (page * PAGE_SIZE + len(page_entries))
203
- summary = f" and {remaining} more" if (remaining > 0 and not is_last_page) else ""
205
+ summary = (
206
+ f" and {remaining} more" if (remaining > 0 and not is_last_page) else ""
207
+ )
204
208
  label = "Return to first page" if is_last_page else f"Next page{summary}"
205
209
  emit_system_message(f" [6] {label}")
206
210
  emit_system_message(" [Enter] Skip loading autosave")
@@ -1,7 +1,7 @@
1
1
  """Camoufox browser manager - privacy-focused Firefox automation."""
2
2
 
3
3
  from pathlib import Path
4
- from typing import Optional, TypeAlias
4
+ from typing import Optional
5
5
 
6
6
  import camoufox
7
7
  from camoufox.addons import DefaultAddons
@@ -10,7 +10,6 @@ from camoufox.locale import ALLOW_GEOIP, download_mmdb
10
10
  from camoufox.pkgman import CamoufoxFetcher, camoufox_path
11
11
  from playwright.async_api import Browser, BrowserContext, Page
12
12
 
13
- _MIN_VIEWPORT_DIMENSION = 640
14
13
 
15
14
  from code_puppy.messaging import emit_info
16
15
 
code_puppy/tui/app.py CHANGED
@@ -176,11 +176,11 @@ class CodePuppyTUI(App):
176
176
  # Start the message renderer EARLY to catch startup messages
177
177
  # Using call_after_refresh to start it as soon as possible after mount
178
178
  self.call_after_refresh(self.start_message_renderer_sync)
179
-
179
+
180
180
  # Kick off a non-blocking preload of the agent/model so the
181
181
  # status bar shows loading before first prompt
182
182
  self.call_after_refresh(self.preload_agent_on_startup)
183
-
183
+
184
184
  # After preload, offer to restore an autosave session (like interactive mode)
185
185
  self.call_after_refresh(self.maybe_prompt_restore_autosave)
186
186
 
@@ -205,7 +205,7 @@ class CodePuppyTUI(App):
205
205
  tight_lines = []
206
206
  last_blank = False
207
207
  for ln in lines:
208
- is_blank = (ln == "")
208
+ is_blank = ln == ""
209
209
  if is_blank and last_blank:
210
210
  continue
211
211
  tight_lines.append(ln)
@@ -522,6 +522,7 @@ class CodePuppyTUI(App):
522
522
  # Auto-save session if enabled (mirror --interactive)
523
523
  try:
524
524
  from code_puppy.config import auto_save_session_if_enabled
525
+
525
526
  auto_save_session_if_enabled()
526
527
  except Exception:
527
528
  pass
@@ -969,10 +970,12 @@ class CodePuppyTUI(App):
969
970
  async def maybe_prompt_restore_autosave(self) -> None:
970
971
  """Offer to restore an autosave session at startup (TUI version)."""
971
972
  try:
972
- import asyncio
973
973
  from pathlib import Path
974
974
 
975
- from code_puppy.config import AUTOSAVE_DIR, set_current_autosave_from_session_name
975
+ from code_puppy.config import (
976
+ AUTOSAVE_DIR,
977
+ set_current_autosave_from_session_name,
978
+ )
976
979
  from code_puppy.session_storage import list_sessions, load_session
977
980
 
978
981
  base_dir = Path(AUTOSAVE_DIR)
@@ -1032,7 +1035,7 @@ class CodePuppyTUI(App):
1032
1035
  # Use Textual's push_screen with a result callback
1033
1036
  def on_picker_result(result_name=None):
1034
1037
  # Schedule async handler to avoid blocking UI
1035
- import asyncio
1038
+
1036
1039
  self.run_worker(handle_result(result_name), exclusive=False)
1037
1040
 
1038
1041
  self.push_screen(picker, on_picker_result)
@@ -2,6 +2,7 @@
2
2
  Autosave Picker modal for TUI.
3
3
  Lists recent autosave sessions and lets the user load one.
4
4
  """
5
+
5
6
  from __future__ import annotations
6
7
 
7
8
  import json
@@ -122,7 +123,11 @@ class AutosavePicker(ModalScreen):
122
123
 
123
124
  for entry in self.entries[:50]:
124
125
  ts = entry.timestamp or "unknown time"
125
- count = f"{entry.message_count} msgs" if entry.message_count is not None else "unknown size"
126
+ count = (
127
+ f"{entry.message_count} msgs"
128
+ if entry.message_count is not None
129
+ else "unknown size"
130
+ )
126
131
  label = f"{entry.name} — {count}, saved at {ts}"
127
132
  self.list_view.append(ListItem(Static(label)))
128
133
 
@@ -138,7 +143,11 @@ class AutosavePicker(ModalScreen):
138
143
  # populate items
139
144
  for entry in self.entries[:50]: # cap to avoid long lists
140
145
  ts = entry.timestamp or "unknown time"
141
- count = f"{entry.message_count} msgs" if entry.message_count is not None else "unknown size"
146
+ count = (
147
+ f"{entry.message_count} msgs"
148
+ if entry.message_count is not None
149
+ else "unknown size"
150
+ )
142
151
  label = f"{entry.name} — {count}, saved at {ts}"
143
152
  self.list_view.append(ListItem(Static(label)))
144
153
  yield self.list_view
@@ -4,6 +4,42 @@
4
4
  "name": "gpt-5",
5
5
  "context_length": 400000
6
6
  },
7
+ "synthetic-DeepSeek-V3.1-Terminus": {
8
+ "type": "custom_openai",
9
+ "name": "hf:deepseek-ai/DeepSeek-V3.1-Terminus",
10
+ "custom_endpoint": {
11
+ "url": "https://api.synthetic.new/openai/v1/",
12
+ "api_key": "$SYN_API_KEY"
13
+ },
14
+ "context_length": 128000
15
+ },
16
+ "synthetic-Kimi-K2-Instruct-0905": {
17
+ "type": "custom_openai",
18
+ "name": "hf:moonshotai/Kimi-K2-Instruct-0905",
19
+ "custom_endpoint": {
20
+ "url": "https://api.synthetic.new/openai/v1/",
21
+ "api_key": "$SYN_API_KEY"
22
+ },
23
+ "context_length": 256000
24
+ },
25
+ "synthetic-Qwen3-Coder-480B-A35B-Instruct": {
26
+ "type": "custom_openai",
27
+ "name": "hf:Qwen/Qwen3-Coder-480B-A35B-Instruct",
28
+ "custom_endpoint": {
29
+ "url": "https://api.synthetic.new/openai/v1/",
30
+ "api_key": "$SYN_API_KEY"
31
+ },
32
+ "context_length": 256000
33
+ },
34
+ "synthetic-GLM-4.6": {
35
+ "type": "custom_openai",
36
+ "name": "hf:zai-org/GLM-4.6",
37
+ "custom_endpoint": {
38
+ "url": "https://api.synthetic.new/openai/v1/",
39
+ "api_key": "$SYN_API_KEY"
40
+ },
41
+ "context_length": 200000
42
+ },
7
43
  "Cerebras-Qwen3-Coder-480b": {
8
44
  "type": "cerebras",
9
45
  "name": "qwen-3-coder-480b",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-puppy
3
- Version: 0.0.206
3
+ Version: 0.0.208
4
4
  Summary: Code generation agent
5
5
  Project-URL: repository, https://github.com/mpfaffenberger/code_puppy
6
6
  Project-URL: HomePage, https://github.com/mpfaffenberger/code_puppy
@@ -97,8 +97,7 @@ Code Puppy is an AI-powered code generation agent, designed to understand progra
97
97
  export MODEL_NAME=gpt-5 # or gemini-2.5-flash-preview-05-20 as an example for Google Gemini models
98
98
  export OPENAI_API_KEY=<your_openai_api_key> # or GEMINI_API_KEY for Google Gemini models
99
99
  export CEREBRAS_API_KEY=<your_cerebras_api_key> # for Cerebras models
100
- export YOLO_MODE=true # to bypass the safety confirmation prompt when running shell commands
101
-
100
+ export SYN_API_KEY=<your https://dev.synthetic.new api key> # for Synthetic provider
102
101
  # or ...
103
102
 
104
103
  export AZURE_OPENAI_API_KEY=...
@@ -107,6 +106,17 @@ export AZURE_OPENAI_ENDPOINT=...
107
106
  code-puppy --interactive
108
107
  ```
109
108
 
109
+ ### Synthetic Provider
110
+
111
+ Code Puppy supports the **Synthetic provider**, which gives you access to various open-source models through a custom OpenAI-compatible endpoint. Set `SYN_API_KEY` to use models like:
112
+
113
+ - `synthetic-DeepSeek-V3.1-Terminus` (128K context)
114
+ - `synthetic-Kimi-K2-Instruct-0905` (256K context)
115
+ - `synthetic-Qwen3-Coder-480B-A35B-Instruct` (256K context)
116
+ - `synthetic-GLM-4.6` (200K context)
117
+
118
+ These models are available via `https://api.synthetic.new/openai/v1/` and provide high-quality coding assistance with generous context windows.
119
+
110
120
  Run specific tasks or engage in interactive mode:
111
121
 
112
122
  ```bash
@@ -1,37 +1,37 @@
1
1
  code_puppy/__init__.py,sha256=ehbM1-wMjNmOXk_DBhhJECFyBv2dRHwwo7ucjHeM68E,107
2
2
  code_puppy/__main__.py,sha256=pDVssJOWP8A83iFkxMLY9YteHYat0EyWDQqMkKHpWp4,203
3
3
  code_puppy/callbacks.py,sha256=ukSgVFaEO68o6J09qFwDrnmNanrVv3toTLQhS504Meo,6162
4
- code_puppy/config.py,sha256=Oo24Z5Abos6Nx7Ho8UVmIPbeCQDlObOdsM8zpYxcLKs,26561
4
+ code_puppy/config.py,sha256=ZeBdSYPRFCdQiMwcovLO14pP3UuANbyfXgQNCgUgKqI,26554
5
5
  code_puppy/http_utils.py,sha256=Hd9bx0nWTmCSRSQxMYF4Hh91bYB1zghqaheNRhHxabM,8957
6
- code_puppy/main.py,sha256=SUh2UNbbEwVWSQwDkz-xBp80Q8qenX7tItsEEopcZfI,24024
7
- code_puppy/model_factory.py,sha256=ZbIAJWMNKNdTCEMQK8Ig6TDDZlVNyGO9hOLHoLLPMYw,15397
8
- code_puppy/models.json,sha256=dppxeQ43J5aDl-5Ytr9Rq31tiEpcQndgDVTuF1Csr_g,1751
6
+ code_puppy/main.py,sha256=i4zcHFyNh7ytrQGLfcbnqXdp2fkso0QKzzosQXVWLgA,24200
7
+ code_puppy/model_factory.py,sha256=t7D45JETQGVQxXewo_Ha-_RYmpkes486Gn7BbldeVas,15401
8
+ code_puppy/models.json,sha256=iZjnV2kZ2ri9eICeVLAoSC_zyUPpWp9G2AHR8QsbfDs,2815
9
9
  code_puppy/reopenable_async_client.py,sha256=4UJRaMp5np8cbef9F0zKQ7TPKOfyf5U-Kv-0zYUWDho,8274
10
10
  code_puppy/round_robin_model.py,sha256=UEfw-Ix7GpNRWSxxuJtA-EE4_A46KXjMgFRciprfLmg,5634
11
- code_puppy/session_storage.py,sha256=Pf5C-qyC6xLhZCTlbAdkPwOFyqlaDomVnj9Z4cZcZsE,9595
11
+ code_puppy/session_storage.py,sha256=rDumPxvUz0VGNfeWxgl7SHs0Slu4W_WiKwYHWN525mc,9659
12
12
  code_puppy/status_display.py,sha256=F6eEAkGePDp4StM2BWj-uLLQTDGtJrf0IufzCeP1rRg,8336
13
13
  code_puppy/summarization_agent.py,sha256=LnObgtLmM6N4z2553XXQlXAOf8R1BPSNmFSfXkjpivg,3211
14
14
  code_puppy/tui_state.py,sha256=TT76XBVapKj6fKjFzz6oxCONeN_BZwcMILxxZcxu6-Y,1171
15
15
  code_puppy/version_checker.py,sha256=bjLDmgGPrl7XnYwX1u13O8uFlsfikV90PK6nbA9Z9QU,1150
16
16
  code_puppy/agents/__init__.py,sha256=PtPB7Z5MSwmUKipgt_qxvIuGggcuVaYwNbnp1UP4tPc,518
17
- code_puppy/agents/agent_c_reviewer.py,sha256=XVOONfnbCS6nEdcXoiowuSB5pnqrXyoWIAjG2cKm7BU,5044
17
+ code_puppy/agents/agent_c_reviewer.py,sha256=fTgiD9P4FfhxkfVnEonp684gIqFKFIm7r5f70tVEwBc,5020
18
18
  code_puppy/agents/agent_code_puppy.py,sha256=vk25J5YSjt30ItfML8KyQc5QR8QumBv5_U8RhqaXUz4,7973
19
19
  code_puppy/agents/agent_code_reviewer.py,sha256=8XHktiFrOVeFZ81WIefuTPQw_IzcNddm4bk46mW46ok,4003
20
20
  code_puppy/agents/agent_cpp_reviewer.py,sha256=H4INgJo2OJ84QT7bfTkw4s1Ml7luwokhAgTsdig2TQQ,3653
21
21
  code_puppy/agents/agent_creator_agent.py,sha256=IiwVirB6uoIeGOmtetut9eDv6o055ykND3V-fvyA8Lw,23042
22
22
  code_puppy/agents/agent_golang_reviewer.py,sha256=-OMuT8hkapVf2Oox46Ck9SRHlsfd8ab8uefbVfdW72M,3348
23
23
  code_puppy/agents/agent_javascript_reviewer.py,sha256=5YC4kRSvorcNgObjHjD2Rrgnvf8jlKhPqWdjOMjU9A0,3636
24
- code_puppy/agents/agent_manager.py,sha256=-q1p3_xHGTguXhDtHvVBWAscvX3ZrSNbXsl382GBeC4,12790
24
+ code_puppy/agents/agent_manager.py,sha256=RppmDEo4YP87WV66JACZhqAsGwjwAu3zfJNihakMvZE,12883
25
25
  code_puppy/agents/agent_python_reviewer.py,sha256=D0M3VA12QKdsyg2zIBI2FECxz0IP2fSIfg24xGzDhw0,3837
26
26
  code_puppy/agents/agent_qa_expert.py,sha256=wCGXzuAVElT5c-QigQVb8JX9Gw0JmViCUQQnADMSbVc,3796
27
27
  code_puppy/agents/agent_qa_kitten.py,sha256=5PeFFSwCFlTUvP6h5bGntx0xv5NmRwBiw0HnMqY8nLI,9107
28
28
  code_puppy/agents/agent_security_auditor.py,sha256=ADafi2x4gqXw6m-Nch5vjiKjO0Urcbj0x4zxHti3gDw,3712
29
29
  code_puppy/agents/agent_typescript_reviewer.py,sha256=EDY1mFkVpuJ1BPXsJFu2wQ2pfAV-90ipc_8w9ymrKPg,4054
30
- code_puppy/agents/base_agent.py,sha256=4hwqOCXQwL2F6luQsYn_IAGjboz1MTU2YIfHG6IYKnU,41409
30
+ code_puppy/agents/base_agent.py,sha256=_xpaLv_b6wJRcjV3ED-V01MVLynnceQwIP21wM7QpEE,41433
31
31
  code_puppy/agents/json_agent.py,sha256=lhopDJDoiSGHvD8A6t50hi9ZBoNRKgUywfxd0Po_Dzc,4886
32
32
  code_puppy/command_line/__init__.py,sha256=y7WeRemfYppk8KVbCGeAIiTuiOszIURCDjOMZv_YRmU,45
33
33
  code_puppy/command_line/attachments.py,sha256=eOf0zqBWnoAgC1FhWOkOyLjx_es0HGEFQ6EV1ZZuc1c,12934
34
- code_puppy/command_line/command_handler.py,sha256=alxMe5v_4jq8Sm6HETsgfF-VoDtgExj9dVzxP77fwmY,31614
34
+ code_puppy/command_line/command_handler.py,sha256=S42khEdRyMrWFgN3X5NyMTu1M15K3hEmrtLGyPdjqYc,31606
35
35
  code_puppy/command_line/file_path_completion.py,sha256=gw8NpIxa6GOpczUJRyh7VNZwoXKKn-yvCqit7h2y6Gg,2931
36
36
  code_puppy/command_line/load_context_completion.py,sha256=6eZxV6Bs-EFwZjN93V8ZDZUC-6RaWxvtZk-04Wtikyw,2240
37
37
  code_puppy/command_line/model_picker_completion.py,sha256=uqwpbMYnCcWUZZ10Y4pMBKBfW52wQ-KdML2PO4Xjwr0,4501
@@ -80,7 +80,7 @@ code_puppy/messaging/queue_console.py,sha256=hf32bKfAOdAaxYuARnmDuWhq4ET77xMWDvu
80
80
  code_puppy/messaging/renderers.py,sha256=9VOpVmu7emyyg1CXgm17u4IzMNcLHvueBl7G14pLQho,16123
81
81
  code_puppy/messaging/spinner/__init__.py,sha256=2yskPQz_hVcUjlK2nNlPdprgCbP56kjdgtOvwWiFUF0,1744
82
82
  code_puppy/messaging/spinner/console_spinner.py,sha256=POwPdJvJE5bJ5ZWUJcEp5iouQjaS0Urw8aWE0YQELxM,7099
83
- code_puppy/messaging/spinner/spinner_base.py,sha256=uUNxAlEjRCuyd0zxwM0B_MfBitBJfeN4tJSSaJfrLv4,2718
83
+ code_puppy/messaging/spinner/spinner_base.py,sha256=JiQDAhCfwrWUFunb8Xcj1caEl34JJY7Bcio7mDeckSc,2694
84
84
  code_puppy/messaging/spinner/textual_spinner.py,sha256=NQsRtbSJoeNz-zGcxrORZ_joJ0CVJlJ0f1ESGryJXIc,3671
85
85
  code_puppy/plugins/__init__.py,sha256=fksDqMUiXPJ5WNuMsYsVR8ulueQRCXPlvECEyicHPtQ,1312
86
86
  code_puppy/plugins/example_custom_command/register_callbacks.py,sha256=Cy3ScPy9wLyqobVBK06ObOpvlHGDyGBSvSZToTj1IcE,1680
@@ -99,10 +99,10 @@ code_puppy/tools/browser/browser_navigation.py,sha256=Tj_fNcM3KGpkM2UTKcGQX8BpI3
99
99
  code_puppy/tools/browser/browser_screenshot.py,sha256=YU4olUqxhqyK3_pBC0BtU6A7_EEtiRlh6saj93nkKAg,8258
100
100
  code_puppy/tools/browser/browser_scripts.py,sha256=MMO5KRjdrhuLOoJGoKGG1jm6UAqhFhUznz02aWqhMAE,15065
101
101
  code_puppy/tools/browser/browser_workflows.py,sha256=jplJ1T60W3G4-dhVJX-CXkm9sskUH_Qzp0Dj-oubvrE,6142
102
- code_puppy/tools/browser/camoufox_manager.py,sha256=bzeerqgQa3CBKVe0UGPpbVR7pKpOVcHlvun7ASRD-KA,7770
102
+ code_puppy/tools/browser/camoufox_manager.py,sha256=93l8KtKEZFbItYsvPK-LPf6ag940nnTROLgNRmH3J3I,7729
103
103
  code_puppy/tools/browser/vqa_agent.py,sha256=0GMDgJAK728rIuSQxAVytFSNagjo0LCjCUxBTm3w9Po,1952
104
104
  code_puppy/tui/__init__.py,sha256=XesAxIn32zLPOmvpR2wIDxDAnnJr81a5pBJB4cZp1Xs,321
105
- code_puppy/tui/app.py,sha256=D-8qHzxYbe-bVgrkBLl2lLBw7HRbUoVqDTRKy1gaE-E,44279
105
+ code_puppy/tui/app.py,sha256=WBVMnjztK_Poc5S7ZfBEX91oSZmgZBTP6owDX5WnyrU,44254
106
106
  code_puppy/tui/messages.py,sha256=zQoToWI0eWdT36NEsY6RdCFzcDfAmfvoPlHv8jiCbgo,720
107
107
  code_puppy/tui/components/__init__.py,sha256=uj5pnk3s6SEN3SbFI0ZnzaA2KK1NNg8TfUj6U-Z732U,455
108
108
  code_puppy/tui/components/chat_view.py,sha256=Ff6uM6J0yENISNAOYroX7F-JL73_ajUUcP5IZSf2mng,19914
@@ -118,14 +118,14 @@ code_puppy/tui/models/chat_message.py,sha256=2fSqsl4EHKgGsi_cVKWBbFq1NQwZyledGuJ
118
118
  code_puppy/tui/models/command_history.py,sha256=bPWr_xnyQvjG5tPg_5pwqlEzn2fR170HlvBJwAXRpAE,2895
119
119
  code_puppy/tui/models/enums.py,sha256=1ulsei95Gxy4r1sk-m-Sm5rdmejYCGRI-YtUwJmKFfM,501
120
120
  code_puppy/tui/screens/__init__.py,sha256=qxiJKyO3MKCNdPjUuHA2-Pnpda0JN20n7e9sU25eC9M,352
121
- code_puppy/tui/screens/autosave_picker.py,sha256=9bazha2C5N3Xg_VcmpcTv-CYOBq_mwcECBfrQM9tHxA,5416
121
+ code_puppy/tui/screens/autosave_picker.py,sha256=OW3d-GrrGINzwdY3h13mJSQjaH5Kej9sU1Xq8IIgIJI,5577
122
122
  code_puppy/tui/screens/help.py,sha256=eJuPaOOCp7ZSUlecearqsuX6caxWv7NQszUh0tZJjBM,3232
123
123
  code_puppy/tui/screens/mcp_install_wizard.py,sha256=vObpQwLbXjQsxmSg-WCasoev1usEi0pollKnL0SHu9U,27693
124
124
  code_puppy/tui/screens/settings.py,sha256=EoMxiguyeF0srwV1bj4_MG9rrxkNthh6TdTNsxnXLfE,11460
125
125
  code_puppy/tui/screens/tools.py,sha256=3pr2Xkpa9Js6Yhf1A3_wQVRzFOui-KDB82LwrsdBtyk,1715
126
- code_puppy-0.0.206.data/data/code_puppy/models.json,sha256=dppxeQ43J5aDl-5Ytr9Rq31tiEpcQndgDVTuF1Csr_g,1751
127
- code_puppy-0.0.206.dist-info/METADATA,sha256=3Yo6ubtVUU_eTNDISuqD_7Y0k0JTvCyOtwQ6BbcXBog,20766
128
- code_puppy-0.0.206.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
129
- code_puppy-0.0.206.dist-info/entry_points.txt,sha256=Tp4eQC99WY3HOKd3sdvb22vZODRq0XkZVNpXOag_KdI,91
130
- code_puppy-0.0.206.dist-info/licenses/LICENSE,sha256=31u8x0SPgdOq3izJX41kgFazWsM43zPEF9eskzqbJMY,1075
131
- code_puppy-0.0.206.dist-info/RECORD,,
126
+ code_puppy-0.0.208.data/data/code_puppy/models.json,sha256=iZjnV2kZ2ri9eICeVLAoSC_zyUPpWp9G2AHR8QsbfDs,2815
127
+ code_puppy-0.0.208.dist-info/METADATA,sha256=av_guE1oZMt5G2CsKQxsdsrkdeO35bYkbPDVi9tz0u0,21312
128
+ code_puppy-0.0.208.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
129
+ code_puppy-0.0.208.dist-info/entry_points.txt,sha256=Tp4eQC99WY3HOKd3sdvb22vZODRq0XkZVNpXOag_KdI,91
130
+ code_puppy-0.0.208.dist-info/licenses/LICENSE,sha256=31u8x0SPgdOq3izJX41kgFazWsM43zPEF9eskzqbJMY,1075
131
+ code_puppy-0.0.208.dist-info/RECORD,,