code-puppy 0.0.176__py3-none-any.whl → 0.0.177__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.
Files changed (33) hide show
  1. code_puppy/agents/__init__.py +2 -2
  2. code_puppy/agents/agent_code_puppy.py +2 -1
  3. code_puppy/agents/agent_creator_agent.py +3 -2
  4. code_puppy/agents/agent_manager.py +5 -5
  5. code_puppy/agents/base_agent.py +60 -40
  6. code_puppy/command_line/command_handler.py +19 -10
  7. code_puppy/command_line/mcp/start_all_command.py +1 -1
  8. code_puppy/command_line/mcp/start_command.py +0 -1
  9. code_puppy/command_line/mcp/stop_all_command.py +1 -1
  10. code_puppy/command_line/mcp/stop_command.py +1 -0
  11. code_puppy/config.py +5 -3
  12. code_puppy/main.py +5 -2
  13. code_puppy/mcp_/examples/retry_example.py +4 -1
  14. code_puppy/messaging/spinner/console_spinner.py +1 -1
  15. code_puppy/model_factory.py +1 -1
  16. code_puppy/round_robin_model.py +2 -4
  17. code_puppy/tools/agent_tools.py +10 -8
  18. code_puppy/tools/browser/browser_screenshot.py +4 -3
  19. code_puppy/tools/browser/browser_scripts.py +0 -6
  20. code_puppy/tools/browser/browser_workflows.py +28 -20
  21. code_puppy/tools/browser/camoufox_manager.py +10 -9
  22. code_puppy/tools/browser_scripts.py +0 -6
  23. code_puppy/tools/browser_workflows.py +28 -20
  24. code_puppy/tools/command_runner.py +1 -1
  25. code_puppy/tui/app.py +3 -13
  26. code_puppy/tui/components/chat_view.py +1 -0
  27. code_puppy/tui/screens/settings.py +3 -3
  28. {code_puppy-0.0.176.dist-info → code_puppy-0.0.177.dist-info}/METADATA +10 -10
  29. {code_puppy-0.0.176.dist-info → code_puppy-0.0.177.dist-info}/RECORD +33 -33
  30. {code_puppy-0.0.176.data → code_puppy-0.0.177.data}/data/code_puppy/models.json +0 -0
  31. {code_puppy-0.0.176.dist-info → code_puppy-0.0.177.dist-info}/WHEEL +0 -0
  32. {code_puppy-0.0.176.dist-info → code_puppy-0.0.177.dist-info}/entry_points.txt +0 -0
  33. {code_puppy-0.0.176.dist-info → code_puppy-0.0.177.dist-info}/licenses/LICENSE +0 -0
@@ -13,10 +13,11 @@ from code_puppy.messaging import emit_error, emit_info
13
13
  from code_puppy.tools.common import generate_group_id
14
14
 
15
15
  from .camoufox_manager import get_camoufox_manager
16
- from .vqa_agent import VisualAnalysisResult, run_vqa_analysis
16
+ from .vqa_agent import run_vqa_analysis
17
17
 
18
-
19
- _TEMP_SCREENSHOT_ROOT = Path(mkdtemp(prefix="code_puppy_screenshots_", dir=gettempdir()))
18
+ _TEMP_SCREENSHOT_ROOT = Path(
19
+ mkdtemp(prefix="code_puppy_screenshots_", dir=gettempdir())
20
+ )
20
21
 
21
22
 
22
23
  def _build_screenshot_path(timestamp: str) -> Path:
@@ -236,9 +236,6 @@ async def wait_for_element(
236
236
  return {"success": False, "error": str(e), "selector": selector, "state": state}
237
237
 
238
238
 
239
-
240
-
241
-
242
239
  async def highlight_element(
243
240
  selector: str,
244
241
  color: str = "red",
@@ -437,9 +434,6 @@ def register_wait_for_element(agent):
437
434
  return await wait_for_element(selector, state, timeout)
438
435
 
439
436
 
440
-
441
-
442
-
443
437
  def register_browser_highlight_element(agent):
444
438
  """Register the element highlighting tool."""
445
439
 
@@ -29,18 +29,18 @@ async def save_workflow(name: str, content: str) -> Dict[str, Any]:
29
29
  workflows_dir = get_workflows_directory()
30
30
 
31
31
  # Clean up the filename - remove spaces, special chars, etc.
32
- safe_name = "".join(c for c in name if c.isalnum() or c in ('-', '_')).lower()
32
+ safe_name = "".join(c for c in name if c.isalnum() or c in ("-", "_")).lower()
33
33
  if not safe_name:
34
34
  safe_name = "workflow"
35
35
 
36
36
  # Ensure .md extension
37
- if not safe_name.endswith('.md'):
38
- safe_name += '.md'
37
+ if not safe_name.endswith(".md"):
38
+ safe_name += ".md"
39
39
 
40
40
  workflow_path = workflows_dir / safe_name
41
41
 
42
42
  # Write the workflow content
43
- with open(workflow_path, 'w', encoding='utf-8') as f:
43
+ with open(workflow_path, "w", encoding="utf-8") as f:
44
44
  f.write(content)
45
45
 
46
46
  emit_info(
@@ -52,7 +52,7 @@ async def save_workflow(name: str, content: str) -> Dict[str, Any]:
52
52
  "success": True,
53
53
  "path": str(workflow_path),
54
54
  "name": safe_name,
55
- "size": len(content)
55
+ "size": len(content),
56
56
  }
57
57
 
58
58
  except Exception as e:
@@ -75,23 +75,27 @@ async def list_workflows() -> Dict[str, Any]:
75
75
  workflows_dir = get_workflows_directory()
76
76
 
77
77
  # Find all .md files in the workflows directory
78
- workflow_files = list(workflows_dir.glob('*.md'))
78
+ workflow_files = list(workflows_dir.glob("*.md"))
79
79
 
80
80
  workflows = []
81
81
  for workflow_file in workflow_files:
82
82
  try:
83
83
  stat = workflow_file.stat()
84
- workflows.append({
85
- "name": workflow_file.name,
86
- "path": str(workflow_file),
87
- "size": stat.st_size,
88
- "modified": stat.st_mtime
89
- })
84
+ workflows.append(
85
+ {
86
+ "name": workflow_file.name,
87
+ "path": str(workflow_file),
88
+ "size": stat.st_size,
89
+ "modified": stat.st_mtime,
90
+ }
91
+ )
90
92
  except Exception as e:
91
- emit_info(f"[yellow]Warning: Could not read {workflow_file}: {e}[/yellow]")
93
+ emit_info(
94
+ f"[yellow]Warning: Could not read {workflow_file}: {e}[/yellow]"
95
+ )
92
96
 
93
97
  # Sort by modification time (newest first)
94
- workflows.sort(key=lambda x: x['modified'], reverse=True)
98
+ workflows.sort(key=lambda x: x["modified"], reverse=True)
95
99
 
96
100
  emit_info(
97
101
  f"[green]✅ Found {len(workflows)} workflow(s)[/green]",
@@ -102,7 +106,7 @@ async def list_workflows() -> Dict[str, Any]:
102
106
  "success": True,
103
107
  "workflows": workflows,
104
108
  "count": len(workflows),
105
- "directory": str(workflows_dir)
109
+ "directory": str(workflows_dir),
106
110
  }
107
111
 
108
112
  except Exception as e:
@@ -125,8 +129,8 @@ async def read_workflow(name: str) -> Dict[str, Any]:
125
129
  workflows_dir = get_workflows_directory()
126
130
 
127
131
  # Handle both with and without .md extension
128
- if not name.endswith('.md'):
129
- name += '.md'
132
+ if not name.endswith(".md"):
133
+ name += ".md"
130
134
 
131
135
  workflow_path = workflows_dir / name
132
136
 
@@ -135,10 +139,14 @@ async def read_workflow(name: str) -> Dict[str, Any]:
135
139
  f"[red]❌ Workflow not found: {name}[/red]",
136
140
  message_group=group_id,
137
141
  )
138
- return {"success": False, "error": f"Workflow '{name}' not found", "name": name}
142
+ return {
143
+ "success": False,
144
+ "error": f"Workflow '{name}' not found",
145
+ "name": name,
146
+ }
139
147
 
140
148
  # Read the workflow content
141
- with open(workflow_path, 'r', encoding='utf-8') as f:
149
+ with open(workflow_path, "r", encoding="utf-8") as f:
142
150
  content = f.read()
143
151
 
144
152
  emit_info(
@@ -151,7 +159,7 @@ async def read_workflow(name: str) -> Dict[str, Any]:
151
159
  "name": name,
152
160
  "content": content,
153
161
  "path": str(workflow_path),
154
- "size": len(content)
162
+ "size": len(content),
155
163
  }
156
164
 
157
165
  except Exception as e:
@@ -3,13 +3,13 @@
3
3
  from typing import Optional
4
4
 
5
5
  import camoufox
6
+ from camoufox.addons import DefaultAddons
7
+ from camoufox.exceptions import CamoufoxNotInstalled, UnsupportedVersion
8
+ from camoufox.locale import ALLOW_GEOIP, download_mmdb
9
+ from camoufox.pkgman import CamoufoxFetcher, camoufox_path
6
10
  from playwright.async_api import Browser, BrowserContext, Page
7
11
 
8
12
  from code_puppy.messaging import emit_info
9
- from camoufox.pkgman import CamoufoxFetcher, camoufox_path
10
- from camoufox.locale import ALLOW_GEOIP, download_mmdb
11
- from camoufox.addons import DefaultAddons
12
- from camoufox.exceptions import CamoufoxNotInstalled, UnsupportedVersion
13
13
 
14
14
 
15
15
  class CamoufoxManager:
@@ -52,7 +52,7 @@ class CamoufoxManager:
52
52
 
53
53
  try:
54
54
  emit_info("[yellow]Initializing Camoufox (privacy Firefox)...[/yellow]")
55
-
55
+
56
56
  # Ensure Camoufox binary and dependencies are fetched before launching
57
57
  await self._prefetch_camoufox()
58
58
 
@@ -62,7 +62,7 @@ class CamoufoxManager:
62
62
  )
63
63
  self._initialized = True
64
64
 
65
- except Exception as e:
65
+ except Exception:
66
66
  await self._cleanup()
67
67
  raise
68
68
 
@@ -83,7 +83,6 @@ class CamoufoxManager:
83
83
  page = await self._context.new_page()
84
84
  await page.goto(self.homepage)
85
85
 
86
-
87
86
  async def get_current_page(self) -> Optional[Page]:
88
87
  """Get the currently active page."""
89
88
  if not self._initialized or not self._context:
@@ -106,7 +105,9 @@ class CamoufoxManager:
106
105
 
107
106
  async def _prefetch_camoufox(self) -> None:
108
107
  """Prefetch Camoufox binary and dependencies."""
109
- emit_info("[cyan]🔍 Ensuring Camoufox binary and dependencies are up-to-date...[/cyan]")
108
+ emit_info(
109
+ "[cyan]🔍 Ensuring Camoufox binary and dependencies are up-to-date...[/cyan]"
110
+ )
110
111
 
111
112
  needs_install = False
112
113
  try:
@@ -168,7 +169,7 @@ class CamoufoxManager:
168
169
  loop.create_task(self._cleanup())
169
170
  else:
170
171
  loop.run_until_complete(self._cleanup())
171
- except:
172
+ except Exception:
172
173
  pass # Best effort cleanup
173
174
 
174
175
 
@@ -236,9 +236,6 @@ async def wait_for_element(
236
236
  return {"success": False, "error": str(e), "selector": selector, "state": state}
237
237
 
238
238
 
239
-
240
-
241
-
242
239
  async def highlight_element(
243
240
  selector: str,
244
241
  color: str = "red",
@@ -437,9 +434,6 @@ def register_wait_for_element(agent):
437
434
  return await wait_for_element(selector, state, timeout)
438
435
 
439
436
 
440
-
441
-
442
-
443
437
  def register_browser_highlight_element(agent):
444
438
  """Register the element highlighting tool."""
445
439
 
@@ -29,18 +29,18 @@ async def save_workflow(name: str, content: str) -> Dict[str, Any]:
29
29
  workflows_dir = get_workflows_directory()
30
30
 
31
31
  # Clean up the filename - remove spaces, special chars, etc.
32
- safe_name = "".join(c for c in name if c.isalnum() or c in ('-', '_')).lower()
32
+ safe_name = "".join(c for c in name if c.isalnum() or c in ("-", "_")).lower()
33
33
  if not safe_name:
34
34
  safe_name = "workflow"
35
35
 
36
36
  # Ensure .md extension
37
- if not safe_name.endswith('.md'):
38
- safe_name += '.md'
37
+ if not safe_name.endswith(".md"):
38
+ safe_name += ".md"
39
39
 
40
40
  workflow_path = workflows_dir / safe_name
41
41
 
42
42
  # Write the workflow content
43
- with open(workflow_path, 'w', encoding='utf-8') as f:
43
+ with open(workflow_path, "w", encoding="utf-8") as f:
44
44
  f.write(content)
45
45
 
46
46
  emit_info(
@@ -52,7 +52,7 @@ async def save_workflow(name: str, content: str) -> Dict[str, Any]:
52
52
  "success": True,
53
53
  "path": str(workflow_path),
54
54
  "name": safe_name,
55
- "size": len(content)
55
+ "size": len(content),
56
56
  }
57
57
 
58
58
  except Exception as e:
@@ -75,23 +75,27 @@ async def list_workflows() -> Dict[str, Any]:
75
75
  workflows_dir = get_workflows_directory()
76
76
 
77
77
  # Find all .md files in the workflows directory
78
- workflow_files = list(workflows_dir.glob('*.md'))
78
+ workflow_files = list(workflows_dir.glob("*.md"))
79
79
 
80
80
  workflows = []
81
81
  for workflow_file in workflow_files:
82
82
  try:
83
83
  stat = workflow_file.stat()
84
- workflows.append({
85
- "name": workflow_file.name,
86
- "path": str(workflow_file),
87
- "size": stat.st_size,
88
- "modified": stat.st_mtime
89
- })
84
+ workflows.append(
85
+ {
86
+ "name": workflow_file.name,
87
+ "path": str(workflow_file),
88
+ "size": stat.st_size,
89
+ "modified": stat.st_mtime,
90
+ }
91
+ )
90
92
  except Exception as e:
91
- emit_info(f"[yellow]Warning: Could not read {workflow_file}: {e}[/yellow]")
93
+ emit_info(
94
+ f"[yellow]Warning: Could not read {workflow_file}: {e}[/yellow]"
95
+ )
92
96
 
93
97
  # Sort by modification time (newest first)
94
- workflows.sort(key=lambda x: x['modified'], reverse=True)
98
+ workflows.sort(key=lambda x: x["modified"], reverse=True)
95
99
 
96
100
  emit_info(
97
101
  f"[green]✅ Found {len(workflows)} workflow(s)[/green]",
@@ -102,7 +106,7 @@ async def list_workflows() -> Dict[str, Any]:
102
106
  "success": True,
103
107
  "workflows": workflows,
104
108
  "count": len(workflows),
105
- "directory": str(workflows_dir)
109
+ "directory": str(workflows_dir),
106
110
  }
107
111
 
108
112
  except Exception as e:
@@ -125,8 +129,8 @@ async def read_workflow(name: str) -> Dict[str, Any]:
125
129
  workflows_dir = get_workflows_directory()
126
130
 
127
131
  # Handle both with and without .md extension
128
- if not name.endswith('.md'):
129
- name += '.md'
132
+ if not name.endswith(".md"):
133
+ name += ".md"
130
134
 
131
135
  workflow_path = workflows_dir / name
132
136
 
@@ -135,10 +139,14 @@ async def read_workflow(name: str) -> Dict[str, Any]:
135
139
  f"[red]❌ Workflow not found: {name}[/red]",
136
140
  message_group=group_id,
137
141
  )
138
- return {"success": False, "error": f"Workflow '{name}' not found", "name": name}
142
+ return {
143
+ "success": False,
144
+ "error": f"Workflow '{name}' not found",
145
+ "name": name,
146
+ }
139
147
 
140
148
  # Read the workflow content
141
- with open(workflow_path, 'r', encoding='utf-8') as f:
149
+ with open(workflow_path, "r", encoding="utf-8") as f:
142
150
  content = f.read()
143
151
 
144
152
  emit_info(
@@ -151,7 +159,7 @@ async def read_workflow(name: str) -> Dict[str, Any]:
151
159
  "name": name,
152
160
  "content": content,
153
161
  "path": str(workflow_path),
154
- "size": len(content)
162
+ "size": len(content),
155
163
  }
156
164
 
157
165
  except Exception as e:
@@ -19,8 +19,8 @@ from code_puppy.messaging import (
19
19
  emit_system_message,
20
20
  emit_warning,
21
21
  )
22
- from code_puppy.tui_state import is_tui_mode
23
22
  from code_puppy.tools.common import generate_group_id
23
+ from code_puppy.tui_state import is_tui_mode
24
24
 
25
25
  # Maximum line length for shell command output to prevent massive token usage
26
26
  # This helps avoid exceeding model context limits when commands produce very long lines
code_puppy/tui/app.py CHANGED
@@ -12,6 +12,8 @@ from textual.events import Resize
12
12
  from textual.reactive import reactive
13
13
  from textual.widgets import Footer, ListView
14
14
 
15
+ # message_history_accumulator and prune_interrupted_tool_calls have been moved to BaseAgent class
16
+ from code_puppy.agents.agent_manager import get_current_agent
15
17
  from code_puppy.command_line.command_handler import handle_command
16
18
  from code_puppy.config import (
17
19
  get_global_model_name,
@@ -19,12 +21,9 @@ from code_puppy.config import (
19
21
  initialize_command_history_file,
20
22
  save_command_to_history,
21
23
  )
22
- # message_history_accumulator and prune_interrupted_tool_calls have been moved to BaseAgent class
23
- from code_puppy.agents.agent_manager import get_current_agent
24
24
 
25
25
  # Import our message queue system
26
26
  from code_puppy.messaging import TUIRenderer, get_global_queue
27
-
28
27
  from code_puppy.tui.components import (
29
28
  ChatView,
30
29
  CustomTextArea,
@@ -33,7 +32,6 @@ from code_puppy.tui.components import (
33
32
  StatusBar,
34
33
  )
35
34
 
36
-
37
35
  # Import shared message classes
38
36
  from .messages import CommandSelected, HistoryEntrySelected
39
37
  from .models import ChatMessage, MessageType
@@ -175,12 +173,6 @@ class CodePuppyTUI(App):
175
173
  "Welcome to Code Puppy 🐶!\n💨 YOLO mode is enabled in TUI: commands will execute without confirmation."
176
174
  )
177
175
 
178
- # Get current agent and display info
179
- agent = get_current_agent()
180
- self.add_system_message(
181
- f"🐕 Loaded agent '{self.puppy_name}' with model '{self.current_model}'"
182
- )
183
-
184
176
  # Start the message renderer EARLY to catch startup messages
185
177
  # Using call_after_refresh to start it as soon as possible after mount
186
178
  self.call_after_refresh(self.start_message_renderer_sync)
@@ -509,9 +501,7 @@ class CodePuppyTUI(App):
509
501
  pass
510
502
  except Exception as agent_error:
511
503
  # Handle any other errors in agent processing
512
- self.add_error_message(
513
- f"Agent processing failed: {str(agent_error)}"
514
- )
504
+ self.add_error_message(f"Agent processing failed: {str(agent_error)}")
515
505
 
516
506
  except Exception as e:
517
507
  self.add_error_message(f"Error processing message: {str(e)}")
@@ -267,6 +267,7 @@ class ChatView(VerticalScroll):
267
267
  ):
268
268
  # If either content is a Rich object, convert both to text and concatenate
269
269
  from io import StringIO
270
+
270
271
  from rich.console import Console
271
272
 
272
273
  # Convert existing content to string
@@ -125,12 +125,12 @@ class SettingsScreen(ModalScreen):
125
125
  def on_mount(self) -> None:
126
126
  """Load current settings when the screen mounts."""
127
127
  from code_puppy.config import (
128
+ get_compaction_strategy,
129
+ get_compaction_threshold,
128
130
  get_global_model_name,
129
131
  get_owner_name,
130
132
  get_protected_token_count,
131
133
  get_puppy_name,
132
- get_compaction_strategy,
133
- get_compaction_threshold,
134
134
  )
135
135
 
136
136
  # Load current values
@@ -188,9 +188,9 @@ class SettingsScreen(ModalScreen):
188
188
  def save_settings(self) -> None:
189
189
  """Save the modified settings."""
190
190
  from code_puppy.config import (
191
+ get_model_context_length,
191
192
  set_config_value,
192
193
  set_model_name,
193
- get_model_context_length,
194
194
  )
195
195
 
196
196
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-puppy
3
- Version: 0.0.176
3
+ Version: 0.0.177
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
@@ -54,15 +54,15 @@ Description-Content-Type: text/markdown
54
54
 
55
55
  ## Overview
56
56
 
57
- *This project was coded angrily in reaction to Windsurf and Cursor removing access to models and raising prices.*
57
+ *This project was coded angrily in reaction to Windsurf and Cursor removing access to models and raising prices.*
58
58
 
59
59
  *You could also run 50 code puppies at once if you were insane enough.*
60
60
 
61
- *Would you rather plow a field with one ox or 1024 puppies?*
61
+ *Would you rather plow a field with one ox or 1024 puppies?*
62
62
  - If you pick the ox, better slam that back button in your browser.
63
-
64
63
 
65
- Code Puppy is an AI-powered code generation agent, designed to understand programming tasks, generate high-quality code, and explain its reasoning similar to tools like Windsurf and Cursor.
64
+
65
+ Code Puppy is an AI-powered code generation agent, designed to understand programming tasks, generate high-quality code, and explain its reasoning similar to tools like Windsurf and Cursor.
66
66
 
67
67
  ## Quick start
68
68
 
@@ -497,22 +497,22 @@ class MyCustomAgent(BaseAgent):
497
497
  @property
498
498
  def name(self) -> str:
499
499
  return "my-agent"
500
-
500
+
501
501
  @property
502
502
  def display_name(self) -> str:
503
503
  return "My Custom Agent ✨"
504
-
504
+
505
505
  @property
506
506
  def description(self) -> str:
507
507
  return "A custom agent for specialized tasks"
508
-
508
+
509
509
  def get_system_prompt(self) -> str:
510
510
  return "Your custom system prompt here..."
511
-
511
+
512
512
  def get_available_tools(self) -> list[str]:
513
513
  return [
514
514
  "list_files",
515
- "read_file",
515
+ "read_file",
516
516
  "grep",
517
517
  "edit_file",
518
518
  "delete_file",
@@ -1,26 +1,26 @@
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=6wYB6K_fGSCkKKEFaYOYkJT45WaV5W_NhUIzcvVH_nU,5060
4
- code_puppy/config.py,sha256=ruPGe9f3kFI9F563NQOKuNQY12kw5eXPzbm2utJ0DO8,20639
4
+ code_puppy/config.py,sha256=smjGUs18VJQxPeVLvV8U2T_YuGh7E_Sg5ZgaXhdBWWg,20677
5
5
  code_puppy/http_utils.py,sha256=YLd8Y16idbI32JGeBXG8n5rT4o4X_zxk9FgUvK9XFo8,8248
6
- code_puppy/main.py,sha256=hVPFNN8QOuct2FFH6OMGQ3E04cmEnmO88ffTbbpfuWY,20516
7
- code_puppy/model_factory.py,sha256=z9vQbcGllgMwU0On8rPvzYxkygW2Uyd3NJmRzbKv-is,13759
6
+ code_puppy/main.py,sha256=c5nxJ6eRve9KFFTxVtioWJ393e6sxy7quld9TQpsH94,20519
7
+ code_puppy/model_factory.py,sha256=KLyxUrZJual6uo_TncjdPhdDbvIvHiztWvK9bfdQmmc,13759
8
8
  code_puppy/models.json,sha256=iXmLZGflnQcu2DRh4WUlgAhoXdvoxUc7KBhB8YxawXM,3088
9
9
  code_puppy/reopenable_async_client.py,sha256=4UJRaMp5np8cbef9F0zKQ7TPKOfyf5U-Kv-0zYUWDho,8274
10
- code_puppy/round_robin_model.py,sha256=SEN3VSwTgC5wHjx2sZsHQLPWOycf4jGwzB-EydgqkdY,5643
10
+ code_puppy/round_robin_model.py,sha256=UEfw-Ix7GpNRWSxxuJtA-EE4_A46KXjMgFRciprfLmg,5634
11
11
  code_puppy/status_display.py,sha256=F6eEAkGePDp4StM2BWj-uLLQTDGtJrf0IufzCeP1rRg,8336
12
12
  code_puppy/summarization_agent.py,sha256=LnObgtLmM6N4z2553XXQlXAOf8R1BPSNmFSfXkjpivg,3211
13
13
  code_puppy/tui_state.py,sha256=TT76XBVapKj6fKjFzz6oxCONeN_BZwcMILxxZcxu6-Y,1171
14
14
  code_puppy/version_checker.py,sha256=bjLDmgGPrl7XnYwX1u13O8uFlsfikV90PK6nbA9Z9QU,1150
15
- code_puppy/agents/__init__.py,sha256=37co1Xux3E10ynvbCBkyeTZAZpjEb-ci2uUy6nzM1hA,518
16
- code_puppy/agents/agent_code_puppy.py,sha256=sbuQxLzlkMbPOyLbILbXOAHecRsxbFdQt13HJ_GEqQo,7972
17
- code_puppy/agents/agent_creator_agent.py,sha256=eNOlJssQdyoQm1F7d-TZWcMXpkYmZ-w9WN-NDFXCgtw,23042
18
- code_puppy/agents/agent_manager.py,sha256=ZT6B7x4hRKdmEzP085_xR8OL8j0YpboWazrs0U7mP1I,11409
15
+ code_puppy/agents/__init__.py,sha256=PtPB7Z5MSwmUKipgt_qxvIuGggcuVaYwNbnp1UP4tPc,518
16
+ code_puppy/agents/agent_code_puppy.py,sha256=vk25J5YSjt30ItfML8KyQc5QR8QumBv5_U8RhqaXUz4,7973
17
+ code_puppy/agents/agent_creator_agent.py,sha256=IiwVirB6uoIeGOmtetut9eDv6o055ykND3V-fvyA8Lw,23042
18
+ code_puppy/agents/agent_manager.py,sha256=USzTbsGGZ9CH17LFeb6P6Im8RPY8qZUGKoH9EZZyU3k,11413
19
19
  code_puppy/agents/agent_qa_kitten.py,sha256=5PeFFSwCFlTUvP6h5bGntx0xv5NmRwBiw0HnMqY8nLI,9107
20
- code_puppy/agents/base_agent.py,sha256=Rv1jXxeFsXfwdyGoVWwoZRgovbi_laex6OivLzaGHpQ,36723
20
+ code_puppy/agents/base_agent.py,sha256=Ld9WTYPMr2uewivHmjBr99L6vlkR1F7jdlz6XG_ZBUQ,37155
21
21
  code_puppy/agents/json_agent.py,sha256=y6AYE3Fx9LhmemcPzt46d7359MNnkGIjU83YBGNer2g,4533
22
22
  code_puppy/command_line/__init__.py,sha256=y7WeRemfYppk8KVbCGeAIiTuiOszIURCDjOMZv_YRmU,45
23
- code_puppy/command_line/command_handler.py,sha256=z4p62jwdJXUJVVzTHStTOFyzv-PwjjNhu8bziIo8gns,27191
23
+ code_puppy/command_line/command_handler.py,sha256=JeJo6kc9-4B7S0_pbMp1LO7jtAT6XMXtSSnOShfoG-Y,27237
24
24
  code_puppy/command_line/file_path_completion.py,sha256=gw8NpIxa6GOpczUJRyh7VNZwoXKKn-yvCqit7h2y6Gg,2931
25
25
  code_puppy/command_line/load_context_completion.py,sha256=6eZxV6Bs-EFwZjN93V8ZDZUC-6RaWxvtZk-04Wtikyw,2240
26
26
  code_puppy/command_line/model_picker_completion.py,sha256=vYNCZS1QWu6fxF__hTwpc7jwH7h_48wUxrnITawc83E,4140
@@ -38,11 +38,11 @@ code_puppy/command_line/mcp/logs_command.py,sha256=x_QsVGPpI5XY7RCZtiNFegc6R3csi
38
38
  code_puppy/command_line/mcp/remove_command.py,sha256=MrWmXQ9jZTq1wrohFDO3ls0a1faTHCqRZocN-ynTzh8,2753
39
39
  code_puppy/command_line/mcp/restart_command.py,sha256=-arZhayEVjTg3WErQKiBoFxbpbQcFlPXTzUI5o8AQLg,3254
40
40
  code_puppy/command_line/mcp/search_command.py,sha256=k4CGiNJ1MKJ1_dPHd3wlwXo899nzizSUr7PsR0V9y4Y,4113
41
- code_puppy/command_line/mcp/start_all_command.py,sha256=cdFi-eEAp4SKTiUvSkCAHaeq3PiujW35a3ZT7UPNlUc,4197
42
- code_puppy/command_line/mcp/start_command.py,sha256=dFB64MJMHAh8v_Jq07Ux4K74P9CP239l_0BHk7wH_2A,3108
41
+ code_puppy/command_line/mcp/start_all_command.py,sha256=aipniBcS9rHg7urqayMVQXXouE4WwLH4CtHkP7QDK5I,4197
42
+ code_puppy/command_line/mcp/start_command.py,sha256=RwLXjxfUzemaU-CKjq5_mCjzKyWbVsIJBbo-dMUfLMs,3107
43
43
  code_puppy/command_line/mcp/status_command.py,sha256=tQJrEDlN4DJ3n9jnKW-4kD0vL3TyUQbovb4V3nz-RsA,6640
44
- code_puppy/command_line/mcp/stop_all_command.py,sha256=BcsvkGcSGCexCnWfpirBNxJNHP0HSGrjQP0LslHbano,3618
45
- code_puppy/command_line/mcp/stop_command.py,sha256=6ruOlABIgGmuFmoakAsaqStaCUctBsA_KbvYNKmlt8U,2456
44
+ code_puppy/command_line/mcp/stop_all_command.py,sha256=z7a9DAnTVsvuxnDSLyllejCDJv8-fdbc1a90sWC93y0,3618
45
+ code_puppy/command_line/mcp/stop_command.py,sha256=TG4mc5JrWh8gnABQbQ5dQkh8RyMgnp_C75tW2QxVSkc,2496
46
46
  code_puppy/command_line/mcp/test_command.py,sha256=Pjod77DYRcA9WDZcxaCe6AUgpEXKJr42QRkxMhSjXhM,3689
47
47
  code_puppy/command_line/mcp/utils.py,sha256=0Wt4ttYgSlVvtusYmBLKXSkjAjcsDiUxcZQAoFLUNnE,3625
48
48
  code_puppy/command_line/mcp/wizard_utils.py,sha256=mWuE5epVgCxgGoj-VGwPO_XWVkkXjegXoIJpC9LC2TM,11075
@@ -62,26 +62,26 @@ code_puppy/mcp_/retry_manager.py,sha256=evVxbtrsHNyo8UoI7zpO-NVDegibn82RLlgN8VKe
62
62
  code_puppy/mcp_/server_registry_catalog.py,sha256=5H9S2IQIF9OE__tfsXmj_T8qOXceoTHH0AxLh4kAbpw,38729
63
63
  code_puppy/mcp_/status_tracker.py,sha256=uekxrzkzIWrv3OfSVgblaPuoGFcAh_dBYwCcaHZ_CrM,12183
64
64
  code_puppy/mcp_/system_tools.py,sha256=7_oR8k0c8YjtCcYF9g7A946oAGuKOf_i-92aJH7VmlQ,7331
65
- code_puppy/mcp_/examples/retry_example.py,sha256=VVdSr7Jq7PPS7AVU1Ev5LnUZe2uBpdZYG7oJSo05TKM,7221
65
+ code_puppy/mcp_/examples/retry_example.py,sha256=Qi5K6cNmhc5-zncZa0F_dkJUEdZ6OIgt1xfG5PUxt3Q,7234
66
66
  code_puppy/messaging/__init__.py,sha256=h2eZ7nJblKF71_dNUIBj3vL5RDw7WGy8nh6T_EYVrcA,1176
67
67
  code_puppy/messaging/message_queue.py,sha256=A6_CVn55tA5cINrIML9N_fS6fGQP-n8gC8abnkwF034,12572
68
68
  code_puppy/messaging/queue_console.py,sha256=hf32bKfAOdAaxYuARnmDuWhq4ET77xMWDvu5_T2JggY,10912
69
69
  code_puppy/messaging/renderers.py,sha256=9VOpVmu7emyyg1CXgm17u4IzMNcLHvueBl7G14pLQho,16123
70
70
  code_puppy/messaging/spinner/__init__.py,sha256=9mkXPYojafydBOAMh9ZUrB4X6uH5Iqz_-E-Obpd72ko,1365
71
- code_puppy/messaging/spinner/console_spinner.py,sha256=DhEXjD37_FuJwcNNfIP2D0y1ruGlFmuCCuaUW4DFrNg,6932
71
+ code_puppy/messaging/spinner/console_spinner.py,sha256=L-9oyuHrzxhlNR3nxcxWbbwVf2_ReOe1tqRbiIJOe3k,6932
72
72
  code_puppy/messaging/spinner/spinner_base.py,sha256=474qMrTYpNfWcprFzmhaOJEOC-2rRHpTFCLsnl54bXA,1689
73
73
  code_puppy/messaging/spinner/textual_spinner.py,sha256=Omx9A-FSPkxYDMYgBXgYMBQnK-DMlyqLOgkFVG8cmo4,3465
74
74
  code_puppy/plugins/__init__.py,sha256=fksDqMUiXPJ5WNuMsYsVR8ulueQRCXPlvECEyicHPtQ,1312
75
75
  code_puppy/tools/__init__.py,sha256=BVTZ85jLHgDANwOnUSOz3UDlp8VQDq4DoGF23BRlyWw,6032
76
- code_puppy/tools/agent_tools.py,sha256=h3i4c6KOxdjLr-fFjUDJdL0OR_XHo_AWx7uwfvavQJ8,5640
76
+ code_puppy/tools/agent_tools.py,sha256=VMTKPfNUiK90ifyJUtEvUpOHmmifpWCxDKv7j6oTaxI,5620
77
77
  code_puppy/tools/browser_control.py,sha256=6E_Kq63cErBk-iM9-03Cq8sTWWLh-Tk2kpdrB_rMmbg,8603
78
78
  code_puppy/tools/browser_interactions.py,sha256=m-bVsAUbdrS-P1GbS0ChO2tMMg4tMIsDX34azn_Olzs,17070
79
79
  code_puppy/tools/browser_locators.py,sha256=ZshjhYuV600vJqXUC23oNX89AZLMvY8rlvj-9oy7GMw,19574
80
80
  code_puppy/tools/browser_navigation.py,sha256=Tj_fNcM3KGpkM2UTKcGQX8BpI373Sv7xZAJf-U7pO5M,7621
81
81
  code_puppy/tools/browser_screenshot.py,sha256=QSwxS37G4LSo-Q9SBiuIofxWKnyInM90TY-_fiWQLrs,9222
82
- code_puppy/tools/browser_scripts.py,sha256=BLSx1Q2F_mOOoGCoyXat3HvazTb1XaFYPXAF8CYVeX8,15071
83
- code_puppy/tools/browser_workflows.py,sha256=4u4u59arpY65hdcDMvJGpT02vks0ufnXNJVujzKe_dg,6430
84
- code_puppy/tools/command_runner.py,sha256=5H4wK-v3UQ713_0JRefpAwyxGBWD9R5yLptR6BhZyIY,22417
82
+ code_puppy/tools/browser_scripts.py,sha256=MMO5KRjdrhuLOoJGoKGG1jm6UAqhFhUznz02aWqhMAE,15065
83
+ code_puppy/tools/browser_workflows.py,sha256=SJfiM2SgZr-qeeQJEivGzUNc51AlLIoqj9h1-mTvVsA,6593
84
+ code_puppy/tools/command_runner.py,sha256=SRhTACgKklHUm_ztbFHnefGbLw4CJOm601or6L1cPGM,22417
85
85
  code_puppy/tools/common.py,sha256=pL-9xcRs3rxU7Fl9X9EUgbDp2-csh2LLJ5DHH_KAHKY,10596
86
86
  code_puppy/tools/file_modifications.py,sha256=EaDWcv6gi8wAvpgyeJdKSKPWg9fTpZoEkxQiLCE6rn4,23218
87
87
  code_puppy/tools/file_operations.py,sha256=3RX-eqhIukle3KA-QTEaiTMIefOWy_JhmPQaijEAt6U,32481
@@ -91,16 +91,16 @@ code_puppy/tools/browser/browser_control.py,sha256=6E_Kq63cErBk-iM9-03Cq8sTWWLh-
91
91
  code_puppy/tools/browser/browser_interactions.py,sha256=m-bVsAUbdrS-P1GbS0ChO2tMMg4tMIsDX34azn_Olzs,17070
92
92
  code_puppy/tools/browser/browser_locators.py,sha256=ZshjhYuV600vJqXUC23oNX89AZLMvY8rlvj-9oy7GMw,19574
93
93
  code_puppy/tools/browser/browser_navigation.py,sha256=Tj_fNcM3KGpkM2UTKcGQX8BpI373Sv7xZAJf-U7pO5M,7621
94
- code_puppy/tools/browser/browser_screenshot.py,sha256=zbOMmN9_9aVDWJkC54-3zv4OEGJMs7LpveTc6JTLcxg,8275
95
- code_puppy/tools/browser/browser_scripts.py,sha256=BLSx1Q2F_mOOoGCoyXat3HvazTb1XaFYPXAF8CYVeX8,15071
96
- code_puppy/tools/browser/browser_workflows.py,sha256=HZ0lPmEyAobPIWR-SK1E0ngW1OfULLqw8XILVT4N8Fg,5979
97
- code_puppy/tools/browser/camoufox_manager.py,sha256=2Pl_UjPA7c413GLk0YZNfA83H09qc-lq7WfWfD6VxL4,6092
94
+ code_puppy/tools/browser/browser_screenshot.py,sha256=YU4olUqxhqyK3_pBC0BtU6A7_EEtiRlh6saj93nkKAg,8258
95
+ code_puppy/tools/browser/browser_scripts.py,sha256=MMO5KRjdrhuLOoJGoKGG1jm6UAqhFhUznz02aWqhMAE,15065
96
+ code_puppy/tools/browser/browser_workflows.py,sha256=jplJ1T60W3G4-dhVJX-CXkm9sskUH_Qzp0Dj-oubvrE,6142
97
+ code_puppy/tools/browser/camoufox_manager.py,sha256=RYvLcs0iAoVNtpLjrrA1uu6a5k9tAdBbmhWFGSWjX_A,6106
98
98
  code_puppy/tools/browser/vqa_agent.py,sha256=0GMDgJAK728rIuSQxAVytFSNagjo0LCjCUxBTm3w9Po,1952
99
99
  code_puppy/tui/__init__.py,sha256=XesAxIn32zLPOmvpR2wIDxDAnnJr81a5pBJB4cZp1Xs,321
100
- code_puppy/tui/app.py,sha256=gZvg7ZOUp3JurZyKZ7ehpHEhmyC0NnfmQYWF_yZm36o,38163
100
+ code_puppy/tui/app.py,sha256=f_8c9t9WF1twn4GCNNnmEgklSyUDC-9-d8_Lkosszjk,37911
101
101
  code_puppy/tui/messages.py,sha256=zQoToWI0eWdT36NEsY6RdCFzcDfAmfvoPlHv8jiCbgo,720
102
102
  code_puppy/tui/components/__init__.py,sha256=uj5pnk3s6SEN3SbFI0ZnzaA2KK1NNg8TfUj6U-Z732U,455
103
- code_puppy/tui/components/chat_view.py,sha256=NfyNXuN2idPht1rKJB4YhHVXb1AIRNO5q_nLdt8Ocug,19913
103
+ code_puppy/tui/components/chat_view.py,sha256=Ff6uM6J0yENISNAOYroX7F-JL73_ajUUcP5IZSf2mng,19914
104
104
  code_puppy/tui/components/command_history_modal.py,sha256=pUPEQvoCWa2iUnuMgNwO22y8eUbyw0HpcPH3wAosHvU,7097
105
105
  code_puppy/tui/components/copy_button.py,sha256=E4-OJYk5YNzDf-E81NyiVGKsTRPrUX-RnQ8qFuVnabw,4375
106
106
  code_puppy/tui/components/custom_widgets.py,sha256=qsVsPLh_oUjMWBznewH8Ya1BdGSiIwNiad2qkdfvCJk,2114
@@ -115,11 +115,11 @@ code_puppy/tui/models/enums.py,sha256=1ulsei95Gxy4r1sk-m-Sm5rdmejYCGRI-YtUwJmKFf
115
115
  code_puppy/tui/screens/__init__.py,sha256=tJ00d0aYQ9kzOGHRChqy6cCQ6JUKKXBzLUTEbk_eA2Y,286
116
116
  code_puppy/tui/screens/help.py,sha256=eJuPaOOCp7ZSUlecearqsuX6caxWv7NQszUh0tZJjBM,3232
117
117
  code_puppy/tui/screens/mcp_install_wizard.py,sha256=vObpQwLbXjQsxmSg-WCasoev1usEi0pollKnL0SHu9U,27693
118
- code_puppy/tui/screens/settings.py,sha256=W22sevojC1_HZBoeoJTH3HWkehini3bGi_ic0OKgeLI,10685
118
+ code_puppy/tui/screens/settings.py,sha256=-WLldnKyWVKUYVPJcfOn1UU6eP9t8lLPUAVI317SOOM,10685
119
119
  code_puppy/tui/screens/tools.py,sha256=3pr2Xkpa9Js6Yhf1A3_wQVRzFOui-KDB82LwrsdBtyk,1715
120
- code_puppy-0.0.176.data/data/code_puppy/models.json,sha256=iXmLZGflnQcu2DRh4WUlgAhoXdvoxUc7KBhB8YxawXM,3088
121
- code_puppy-0.0.176.dist-info/METADATA,sha256=DdACj0Hz-4JSKT6RCDHyLbIjusHHJ1QTDpDio-dDKa4,20103
122
- code_puppy-0.0.176.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
123
- code_puppy-0.0.176.dist-info/entry_points.txt,sha256=Tp4eQC99WY3HOKd3sdvb22vZODRq0XkZVNpXOag_KdI,91
124
- code_puppy-0.0.176.dist-info/licenses/LICENSE,sha256=31u8x0SPgdOq3izJX41kgFazWsM43zPEF9eskzqbJMY,1075
125
- code_puppy-0.0.176.dist-info/RECORD,,
120
+ code_puppy-0.0.177.data/data/code_puppy/models.json,sha256=iXmLZGflnQcu2DRh4WUlgAhoXdvoxUc7KBhB8YxawXM,3088
121
+ code_puppy-0.0.177.dist-info/METADATA,sha256=vB7gqal8pk_r66WIRbKSAwFc3m8DybT0lAHaCiMaTrE,20079
122
+ code_puppy-0.0.177.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
123
+ code_puppy-0.0.177.dist-info/entry_points.txt,sha256=Tp4eQC99WY3HOKd3sdvb22vZODRq0XkZVNpXOag_KdI,91
124
+ code_puppy-0.0.177.dist-info/licenses/LICENSE,sha256=31u8x0SPgdOq3izJX41kgFazWsM43zPEF9eskzqbJMY,1075
125
+ code_puppy-0.0.177.dist-info/RECORD,,