code-puppy 0.0.155__py3-none-any.whl → 0.0.157__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.
code_puppy/agent.py CHANGED
@@ -134,7 +134,15 @@ def reload_code_generation_agent(message_group: str | None):
134
134
  clear_model_cache()
135
135
  clear_agent_cache()
136
136
 
137
- model_name = get_model_name()
137
+ # Check if current agent has a pinned model
138
+ from code_puppy.agents import get_current_agent_config
139
+ agent_config = get_current_agent_config()
140
+ agent_model_name = None
141
+ if hasattr(agent_config, 'get_model_name'):
142
+ agent_model_name = agent_config.get_model_name()
143
+
144
+ # Use agent-specific model if pinned, otherwise use global model
145
+ model_name = agent_model_name if agent_model_name else get_model_name()
138
146
  emit_info(
139
147
  f"[bold cyan]Loading Model: {model_name}[/bold cyan]",
140
148
  message_group=message_group,
@@ -193,7 +201,19 @@ def get_code_generation_agent(force_reload=False, message_group: str | None = No
193
201
  message_group = str(uuid.uuid4())
194
202
  from code_puppy.config import get_model_name
195
203
 
196
- model_name = get_model_name()
204
+ # Get the global model name
205
+ global_model_name = get_model_name()
206
+
207
+ # Check if current agent has a pinned model
208
+ from code_puppy.agents import get_current_agent_config
209
+ agent_config = get_current_agent_config()
210
+ agent_model_name = None
211
+ if hasattr(agent_config, 'get_model_name'):
212
+ agent_model_name = agent_config.get_model_name()
213
+
214
+ # Use agent-specific model if pinned, otherwise use global model
215
+ model_name = agent_model_name if agent_model_name else global_model_name
216
+
197
217
  if _code_generation_agent is None or _LAST_MODEL_NAME != model_name or force_reload:
198
218
  return reload_code_generation_agent(message_group)
199
219
  return _code_generation_agent
@@ -6,6 +6,7 @@ from typing import Dict, List, Optional
6
6
 
7
7
  from .base_agent import BaseAgent
8
8
  from code_puppy.config import get_user_agents_directory
9
+ from code_puppy.model_factory import ModelFactory
9
10
  from code_puppy.tools import get_available_tool_names
10
11
 
11
12
 
@@ -27,6 +28,16 @@ class AgentCreatorAgent(BaseAgent):
27
28
  def get_system_prompt(self) -> str:
28
29
  available_tools = get_available_tool_names()
29
30
  agents_dir = get_user_agents_directory()
31
+
32
+ # Load available models dynamically
33
+ models_config = ModelFactory.load_config()
34
+ model_descriptions = []
35
+ for model_name, model_info in models_config.items():
36
+ model_type = model_info.get('type', 'Unknown')
37
+ context_length = model_info.get('context_length', 'Unknown')
38
+ model_descriptions.append(f"- **{model_name}**: {model_type} model with {context_length} context")
39
+
40
+ available_models_str = "\n".join(model_descriptions)
30
41
 
31
42
  return f"""You are the Agent Creator! 🏗️ Your mission is to help users create awesome JSON agent files through an interactive process.
32
43
 
@@ -39,7 +50,7 @@ You specialize in:
39
50
  - Creating properly structured JSON agent files
40
51
  - Explaining agent capabilities and best practices
41
52
 
42
- ## MANDATORY TOOL SELECTION PROCESS
53
+ ## MANDATORY AGENT CREATION PROCESS
43
54
 
44
55
  **YOU MUST ALWAYS:**
45
56
  1. Ask the user what the agent should be able to do
@@ -47,6 +58,8 @@ You specialize in:
47
58
  3. List ALL available tools so they can see other options
48
59
  4. Ask them to confirm their tool selection
49
60
  5. Explain why each selected tool is useful for their agent
61
+ 6. Ask if they want to pin a specific model to the agent using your `ask_about_model_pinning` method
62
+ 7. Include the model in the final JSON if the user chooses to pin one
50
63
 
51
64
  ## JSON Agent Schema
52
65
 
@@ -63,7 +76,8 @@ Here's the complete schema for JSON agent files:
63
76
  "user_prompt": "How can I help?", // OPTIONAL: Custom greeting
64
77
  "tools_config": {{ // OPTIONAL: Tool configuration
65
78
  "timeout": 60
66
- }}
79
+ }},
80
+ "model": "model-name" // OPTIONAL: Pin a specific model for this agent
67
81
  }}
68
82
  ```
69
83
 
@@ -77,10 +91,24 @@ Here's the complete schema for JSON agent files:
77
91
  - `display_name`: Pretty display name (defaults to title-cased name + 🤖)
78
92
  - `user_prompt`: Custom user greeting
79
93
  - `tools_config`: Tool configuration object
94
+ - `model`: Pin a specific model for this agent (defaults to global model)
80
95
 
81
96
  ## ALL AVAILABLE TOOLS:
82
97
  {", ".join(f"- **{tool}**" for tool in available_tools)}
83
98
 
99
+ ## ALL AVAILABLE MODELS:
100
+ {available_models_str}
101
+
102
+ Users can optionally pin a specific model to their agent to override the global default.
103
+
104
+ ### When to Pin Models:
105
+ - For specialized agents that need specific capabilities (e.g., code-heavy agents might need a coding model)
106
+ - When cost optimization is important (use a smaller model for simple tasks)
107
+ - For privacy-sensitive work (use a local model)
108
+ - When specific performance characteristics are needed
109
+
110
+ **When asking users about model pinning, explain these use cases and why it might be beneficial for their agent!**
111
+
84
112
  ## Tool Categories & Suggestions:
85
113
 
86
114
  ### 📁 **File Operations** (for agents working with files):
@@ -122,13 +150,15 @@ Use this to recursively search for a string across files starting from the speci
122
150
 
123
151
  ### Tool Usage Instructions:
124
152
 
125
- #### `edit_file` tool usage details:
153
+ #### `ask_about_model_pinning(agent_config)`
154
+ Use this method to ask the user whether they want to pin a specific model to their agent. Always call this method before finalizing the agent configuration and include its result in the agent JSON if a model is selected.
126
155
  This is an all-in-one file-modification tool. It supports the following Pydantic Object payload types:
127
156
  1. ContentPayload: {{ file_path="example.py", "content": "…", "overwrite": true|false }} → Create or overwrite a file with the provided content.
128
157
  2. ReplacementsPayload: {{ file_path="example.py", "replacements": [ {{ "old_str": "…", "new_str": "…" }}, … ] }} → Perform exact text replacements inside an existing file.
129
158
  3. DeleteSnippetPayload: {{ file_path="example.py", "delete_snippet": "…" }} → Remove a snippet of text from an existing file.
130
159
 
131
160
  Arguments:
161
+ - agent_config (required): The agent configuration dictionary built so far.
132
162
  - payload (required): One of the Pydantic payload types above.
133
163
 
134
164
  Example (create):
@@ -271,11 +301,12 @@ This detailed documentation should be copied verbatim into any agent that will b
271
301
  3. **🎯 SUGGEST TOOLS** based on their answer with explanations
272
302
  4. **📋 SHOW ALL TOOLS** so they know all options
273
303
  5. **✅ CONFIRM TOOL SELECTION** and explain choices
274
- 6. **Craft system prompt** that defines agent behavior, including ALL detailed tool documentation for selected tools
275
- 7. **Generate complete JSON** with proper structure
276
- 8. **🚨 MANDATORY: ASK FOR USER CONFIRMATION** of the generated JSON
277
- 9. **🤖 AUTOMATICALLY CREATE THE FILE** once user confirms (no additional asking)
278
- 10. **Validate and test** the new agent
304
+ 6. **Ask about model pinning**: "Do you want to pin a specific model to this agent?" with list of options
305
+ 7. **Craft system prompt** that defines agent behavior, including ALL detailed tool documentation for selected tools
306
+ 8. **Generate complete JSON** with proper structure
307
+ 9. **🚨 MANDATORY: ASK FOR USER CONFIRMATION** of the generated JSON
308
+ 10. **🤖 AUTOMATICALLY CREATE THE FILE** once user confirms (no additional asking)
309
+ 11. **Validate and test** the new agent
279
310
 
280
311
  ## CRITICAL WORKFLOW RULES:
281
312
 
@@ -302,6 +333,14 @@ This detailed documentation should be copied verbatim into any agent that will b
302
333
  **For "File organizer":** → Suggest `list_files`, `read_file`, `edit_file`, `delete_file`, `agent_share_your_reasoning`
303
334
  **For "Agent orchestrator":** → Suggest `list_agents`, `invoke_agent`, `agent_share_your_reasoning`
304
335
 
336
+ ## Model Selection Guidance:
337
+
338
+ **For code-heavy tasks**: → Suggest `Cerebras-Qwen3-Coder-480b`, `grok-code-fast-1`, or `gpt-4.1`
339
+ **For document analysis**: → Suggest `gemini-2.5-flash-preview-05-20` or `claude-4-0-sonnet`
340
+ **For general reasoning**: → Suggest `gpt-5` or `o3`
341
+ **For cost-conscious tasks**: → Suggest `gpt-4.1-mini` or `gpt-4.1-nano`
342
+ **For local/private work**: → Suggest `ollama-llama3.3` or `gpt-4.1-custom`
343
+
305
344
  ## Best Practices
306
345
 
307
346
  - Use descriptive names with hyphens (e.g., "python-tutor", "code-reviewer")
@@ -320,6 +359,7 @@ This detailed documentation should be copied verbatim into any agent that will b
320
359
  "name": "python-tutor",
321
360
  "display_name": "Python Tutor 🐍",
322
361
  "description": "Teaches Python programming concepts with examples",
362
+ "model": "gpt-5",
323
363
  "system_prompt": [
324
364
  "You are a patient Python programming tutor.",
325
365
  "You explain concepts clearly with practical examples.",
@@ -327,7 +367,8 @@ This detailed documentation should be copied verbatim into any agent that will b
327
367
  "Always encourage learning and provide constructive feedback."
328
368
  ],
329
369
  "tools": ["read_file", "edit_file", "agent_share_your_reasoning"],
330
- "user_prompt": "What Python concept would you like to learn today?"
370
+ "user_prompt": "What Python concept would you like to learn today?",
371
+ "model": "Cerebras-Qwen3-Coder-480b" // Optional: Pin to a specific code model
331
372
  }}
332
373
  ```
333
374
 
@@ -344,7 +385,8 @@ This detailed documentation should be copied verbatim into any agent that will b
344
385
  "You follow language-specific best practices and conventions."
345
386
  ],
346
387
  "tools": ["list_files", "read_file", "grep", "agent_share_your_reasoning"],
347
- "user_prompt": "Which code would you like me to review?"
388
+ "user_prompt": "Which code would you like me to review?",
389
+ "model": "claude-4-0-sonnet" // Optional: Pin to a model good at analysis
348
390
  }}
349
391
  ```
350
392
 
@@ -360,7 +402,8 @@ This detailed documentation should be copied verbatim into any agent that will b
360
402
  "You coordinate between multiple agents to get complex work done."
361
403
  ],
362
404
  "tools": ["list_agents", "invoke_agent", "agent_share_your_reasoning"],
363
- "user_prompt": "What can I help you accomplish today?"
405
+ "user_prompt": "What can I help you accomplish today?",
406
+ "model": "gpt-5" // Optional: Pin to a reasoning-focused model
364
407
  }}
365
408
  ```
366
409
 
@@ -370,9 +413,11 @@ Be interactive - ask questions, suggest improvements, and guide users through th
370
413
 
371
414
  ## REMEMBER: COMPLETE THE WORKFLOW!
372
415
  - After generating JSON, ALWAYS get confirmation
416
+ - Ask about model pinning using your `ask_about_model_pinning` method
373
417
  - Once confirmed, IMMEDIATELY create the file (don't ask again)
374
418
  - Use your `edit_file` tool to save the JSON
375
419
  - Always explain how to use the new agent with `/agent agent-name`
420
+ - Mention that users can later change or pin the model with `/pin_model agent-name model-name`
376
421
 
377
422
  ## Tool Documentation Requirements
378
423
 
@@ -101,6 +101,14 @@ class JSONAgent(BaseAgent):
101
101
  """Get tool configuration from JSON config."""
102
102
  return self._config.get("tools_config")
103
103
 
104
+ def get_model_name(self) -> Optional[str]:
105
+ """Get pinned model name from JSON config, if specified.
106
+
107
+ Returns:
108
+ Model name to use for this agent, or None to use global default.
109
+ """
110
+ return self._config.get("model")
111
+
104
112
 
105
113
  def discover_json_agents() -> Dict[str, str]:
106
114
  """Discover JSON agent files in the user's agents directory.
@@ -42,6 +42,10 @@ def get_commands_help():
42
42
  help_lines.append(
43
43
  Text("/model, /m", style="cyan") + Text(" <model> Set active model")
44
44
  )
45
+ help_lines.append(
46
+ Text("/pin_model", style="cyan")
47
+ + Text(" <agent> <model> Pin a specific model to an agent")
48
+ )
45
49
  help_lines.append(
46
50
  Text("/mcp", style="cyan")
47
51
  + Text(" Manage MCP servers (list, start, stop, status, etc.)")
@@ -398,6 +402,85 @@ def handle_command(command: str):
398
402
  emit_info(help_text, message_group_id=group_id)
399
403
  return True
400
404
 
405
+ if command.startswith("/pin_model"):
406
+ # Handle agent model pinning
407
+ from code_puppy.agents.json_agent import discover_json_agents
408
+ from code_puppy.command_line.model_picker_completion import load_model_names
409
+ import json
410
+
411
+ tokens = command.split()
412
+
413
+ if len(tokens) != 3:
414
+ emit_warning("Usage: /pin_model <agent-name> <model-name>")
415
+
416
+ # Show available models and JSON agents
417
+ available_models = load_model_names()
418
+ json_agents = discover_json_agents()
419
+
420
+ emit_info("Available models:")
421
+ for model in available_models:
422
+ emit_info(f" [cyan]{model}[/cyan]")
423
+
424
+ if json_agents:
425
+ emit_info("\nAvailable JSON agents:")
426
+ for agent_name, agent_path in json_agents.items():
427
+ emit_info(f" [cyan]{agent_name}[/cyan] ({agent_path})")
428
+ return True
429
+
430
+ agent_name = tokens[1].lower()
431
+ model_name = tokens[2]
432
+
433
+ # Check if model exists
434
+ available_models = load_model_names()
435
+ if model_name not in available_models:
436
+ emit_error(f"Model '{model_name}' not found")
437
+ emit_warning(f"Available models: {', '.join(available_models)}")
438
+ return True
439
+
440
+ # Check that we're modifying a JSON agent (not a built-in Python agent)
441
+ json_agents = discover_json_agents()
442
+ if agent_name not in json_agents:
443
+ emit_error(f"JSON agent '{agent_name}' not found")
444
+
445
+ # Show available JSON agents
446
+ if json_agents:
447
+ emit_info("Available JSON agents:")
448
+ for name, path in json_agents.items():
449
+ emit_info(f" [cyan]{name}[/cyan] ({path})")
450
+ return True
451
+
452
+ agent_file_path = json_agents[agent_name]
453
+
454
+ # Load, modify, and save the agent configuration
455
+ try:
456
+ with open(agent_file_path, "r", encoding="utf-8") as f:
457
+ agent_config = json.load(f)
458
+
459
+ # Set the model
460
+ agent_config["model"] = model_name
461
+
462
+ # Save the updated configuration
463
+ with open(agent_file_path, "w", encoding="utf-8") as f:
464
+ json.dump(agent_config, f, indent=2, ensure_ascii=False)
465
+
466
+ emit_success(f"Model '{model_name}' pinned to agent '{agent_name}'")
467
+
468
+ # If this is the current agent, reload it to use the new model
469
+ from code_puppy.agents import get_current_agent_config
470
+ from code_puppy.agents.runtime_manager import get_runtime_agent_manager
471
+
472
+ current_agent = get_current_agent_config()
473
+ if current_agent.name == agent_name:
474
+ manager = get_runtime_agent_manager()
475
+ manager.reload_agent()
476
+ emit_info(f"Active agent reloaded with pinned model '{model_name}'")
477
+
478
+ return True
479
+
480
+ except Exception as e:
481
+ emit_error(f"Failed to pin model to agent '{agent_name}': {e}")
482
+ return True
483
+
401
484
  if command.startswith("/generate-pr-description"):
402
485
  # Parse directory argument (e.g., /generate-pr-description @some/dir)
403
486
  tokens = command.split()
@@ -139,12 +139,28 @@ def get_prompt_with_active_model(base: str = ">>> "):
139
139
  from code_puppy.agents.agent_manager import get_current_agent_config
140
140
 
141
141
  puppy = get_puppy_name()
142
- model = get_active_model() or "(default)"
142
+ global_model = get_active_model() or "(default)"
143
143
 
144
144
  # Get current agent information
145
145
  current_agent = get_current_agent_config()
146
146
  agent_display = current_agent.display_name if current_agent else "code-puppy"
147
147
 
148
+ # Check if current agent has a pinned model
149
+ agent_model = None
150
+ if current_agent and hasattr(current_agent, 'get_model_name'):
151
+ agent_model = current_agent.get_model_name()
152
+
153
+ # Determine which model to display
154
+ if agent_model and agent_model != global_model:
155
+ # Show both models when they differ
156
+ model_display = f"[{global_model} → {agent_model}]"
157
+ elif agent_model:
158
+ # Show only the agent model when pinned
159
+ model_display = f"[{agent_model}]"
160
+ else:
161
+ # Show only the global model when no agent model is pinned
162
+ model_display = f"[{global_model}]"
163
+
148
164
  cwd = os.getcwd()
149
165
  home = os.path.expanduser("~")
150
166
  if cwd.startswith(home):
@@ -157,7 +173,7 @@ def get_prompt_with_active_model(base: str = ">>> "):
157
173
  ("class:puppy", f"{puppy}"),
158
174
  ("", " "),
159
175
  ("class:agent", f"[{agent_display}] "),
160
- ("class:model", "[" + str(model) + "] "),
176
+ ("class:model", model_display + " "),
161
177
  ("class:cwd", "(" + str(cwd_display) + ") "),
162
178
  ("class:arrow", str(base)),
163
179
  ]
code_puppy/models.json CHANGED
@@ -1,30 +1,4 @@
1
1
  {
2
- "openrouter-sonoma-dusk-alpha": {
3
- "type": "custom_openai",
4
- "name": "openrouter/sonoma-dusk-alpha",
5
- "custom_endpoint": {
6
- "url": "https://openrouter.ai/api/v1",
7
- "api_key": "$OPENROUTER_API_KEY",
8
- "headers": {
9
- "HTTP-Referer": "https://github.com/mpfaffenberger/code_puppy",
10
- "X-Title": "Code Puppy"
11
- }
12
- },
13
- "context_length": 2000000
14
- },
15
- "openrouter-sonoma-sky-alpha": {
16
- "type": "custom_openai",
17
- "name": "openrouter/sonoma-sky-alpha",
18
- "custom_endpoint": {
19
- "url": "https://openrouter.ai/api/v1",
20
- "api_key": "$OPENROUTER_API_KEY",
21
- "headers": {
22
- "HTTP-Referer": "https://github.com/mpfaffenberger/code_puppy",
23
- "X-Title": "Code Puppy"
24
- }
25
- },
26
- "context_length": 2000000
27
- },
28
2
  "gpt-5": {
29
3
  "type": "openai",
30
4
  "name": "gpt-5",
@@ -1,30 +1,4 @@
1
1
  {
2
- "openrouter-sonoma-dusk-alpha": {
3
- "type": "custom_openai",
4
- "name": "openrouter/sonoma-dusk-alpha",
5
- "custom_endpoint": {
6
- "url": "https://openrouter.ai/api/v1",
7
- "api_key": "$OPENROUTER_API_KEY",
8
- "headers": {
9
- "HTTP-Referer": "https://github.com/mpfaffenberger/code_puppy",
10
- "X-Title": "Code Puppy"
11
- }
12
- },
13
- "context_length": 2000000
14
- },
15
- "openrouter-sonoma-sky-alpha": {
16
- "type": "custom_openai",
17
- "name": "openrouter/sonoma-sky-alpha",
18
- "custom_endpoint": {
19
- "url": "https://openrouter.ai/api/v1",
20
- "api_key": "$OPENROUTER_API_KEY",
21
- "headers": {
22
- "HTTP-Referer": "https://github.com/mpfaffenberger/code_puppy",
23
- "X-Title": "Code Puppy"
24
- }
25
- },
26
- "context_length": 2000000
27
- },
28
2
  "gpt-5": {
29
3
  "type": "openai",
30
4
  "name": "gpt-5",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-puppy
3
- Version: 0.0.155
3
+ Version: 0.0.157
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
@@ -10,8 +10,9 @@ License-File: LICENSE
10
10
  Classifier: License :: OSI Approved :: MIT License
11
11
  Classifier: Operating System :: OS Independent
12
12
  Classifier: Programming Language :: Python :: 3
13
- Classifier: Programming Language :: Python :: 3.10
14
13
  Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
15
16
  Classifier: Topic :: Software Development :: Code Generators
16
17
  Requires-Python: >=3.11
17
18
  Requires-Dist: bs4>=0.0.2
@@ -1,13 +1,13 @@
1
1
  code_puppy/__init__.py,sha256=ehbM1-wMjNmOXk_DBhhJECFyBv2dRHwwo7ucjHeM68E,107
2
2
  code_puppy/__main__.py,sha256=pDVssJOWP8A83iFkxMLY9YteHYat0EyWDQqMkKHpWp4,203
3
- code_puppy/agent.py,sha256=lwDDAfm7h6XVzMa99VHm4ddAOOaG5TBz3u3QIWhvB8c,7245
3
+ code_puppy/agent.py,sha256=hZOrJJJDwtLtb82b6Zyt5CZb8RbzDtvHMIBUPVYsgOM,8133
4
4
  code_puppy/callbacks.py,sha256=6wYB6K_fGSCkKKEFaYOYkJT45WaV5W_NhUIzcvVH_nU,5060
5
5
  code_puppy/config.py,sha256=nD-1Ftwzd1LgZIi5Pi0P4_8DvPkZiOwFXQ5UuYFMO6E,16207
6
6
  code_puppy/http_utils.py,sha256=BAvt4hed7fVMXglA7eS9gOb08h2YTuOyai6VmQq09fg,3432
7
7
  code_puppy/main.py,sha256=tYLfhUjPTJ-4S1r-pr-jSbn6kIU1iYvt2Z8lxI7zDFY,22220
8
8
  code_puppy/message_history_processor.py,sha256=aV-vcRcOQJPZPlrokB4CaLMxEU3Y4nDiabb9Ov_sJeU,15933
9
9
  code_puppy/model_factory.py,sha256=0tJWwmKHSqNGEiakk1aGdUrlZyQy0QM4yShxHqxmXpA,11758
10
- code_puppy/models.json,sha256=jNLDAGhbASNAhul64H4SMS5V4Y6QKW09WcNej4I_4oc,4034
10
+ code_puppy/models.json,sha256=dAfpMMI2EEeOMv0ynHSmMuJAYDLcZrs5gCLX3voC4-A,3252
11
11
  code_puppy/reopenable_async_client.py,sha256=4UJRaMp5np8cbef9F0zKQ7TPKOfyf5U-Kv-0zYUWDho,8274
12
12
  code_puppy/round_robin_model.py,sha256=SEN3VSwTgC5wHjx2sZsHQLPWOycf4jGwzB-EydgqkdY,5643
13
13
  code_puppy/state_management.py,sha256=o4mNBCPblRyVrNBH-992-1YqffgH6AKHU7iZRqgP1LI,5925
@@ -16,20 +16,20 @@ code_puppy/summarization_agent.py,sha256=kos4_YK-l_YjYRq4Fs4X5YoTUbmAcDhhPqefL-r
16
16
  code_puppy/version_checker.py,sha256=bjLDmgGPrl7XnYwX1u13O8uFlsfikV90PK6nbA9Z9QU,1150
17
17
  code_puppy/agents/__init__.py,sha256=SwtHGNG1GIgDBv7y3EGIXOXEWrG_Ou7fEknNgFbrHv8,594
18
18
  code_puppy/agents/agent_code_puppy.py,sha256=sbuQxLzlkMbPOyLbILbXOAHecRsxbFdQt13HJ_GEqQo,7972
19
- code_puppy/agents/agent_creator_agent.py,sha256=yYK7Aggg_GpHKAl-GnK0tDL4WjvHeuGBFDcF7JoXRoo,20534
19
+ code_puppy/agents/agent_creator_agent.py,sha256=jyOfqCa4d3Tqlv0ZODjK1J6cRwJjBxKyNa9RQSdsB44,23256
20
20
  code_puppy/agents/agent_manager.py,sha256=nXvro6fpX8KA-NedRoVJuhJW966trrePOrH4eAnqq40,17034
21
21
  code_puppy/agents/agent_orchestrator.json,sha256=Iqnc0p6ICoAlUTMkEsi1XXMXJi4pdxVnWZUMaih6s5o,1267
22
22
  code_puppy/agents/base_agent.py,sha256=XYSff6IQX9Z6C7hPVbN_YXC2xfjwd268e2jtG3ZGnVk,3450
23
- code_puppy/agents/json_agent.py,sha256=0j6_P1ppje7TsjaZIbxKn8meiuvoBngvjVLNdtCkGwc,4272
23
+ code_puppy/agents/json_agent.py,sha256=y6AYE3Fx9LhmemcPzt46d7359MNnkGIjU83YBGNer2g,4533
24
24
  code_puppy/agents/runtime_manager.py,sha256=fUOBpmETo3wTyLc5wWBfGKSX1HFRQWSpuwxYAOyA-_8,10059
25
25
  code_puppy/command_line/__init__.py,sha256=y7WeRemfYppk8KVbCGeAIiTuiOszIURCDjOMZv_YRmU,45
26
- code_puppy/command_line/command_handler.py,sha256=1o9tKAGycpHFDBldYRAAvY5HJ6QAfikLPrXTEkfw37o,21137
26
+ code_puppy/command_line/command_handler.py,sha256=KVZySqUMJwrRadKSUCcWa62FZ_lge5XjxD0Hebzr2EE,24520
27
27
  code_puppy/command_line/file_path_completion.py,sha256=gw8NpIxa6GOpczUJRyh7VNZwoXKKn-yvCqit7h2y6Gg,2931
28
28
  code_puppy/command_line/load_context_completion.py,sha256=6eZxV6Bs-EFwZjN93V8ZDZUC-6RaWxvtZk-04Wtikyw,2240
29
29
  code_puppy/command_line/meta_command_handler.py,sha256=80aK5JQOaqjt149qBmSsM02uy2Cikkee8zaQnu5u2KQ,5712
30
30
  code_puppy/command_line/model_picker_completion.py,sha256=adxp3NZaDV67YqaGv0SG7WVvOTXN0UwkkLqxTsknAvs,4126
31
31
  code_puppy/command_line/motd.py,sha256=PEdkp3ZnydVfvd7mNJylm8YyFNUKg9jmY6uwkA1em8c,2152
32
- code_puppy/command_line/prompt_toolkit_completion.py,sha256=vmsA0F4TfXZ3gjVzCfSNM3TIY-w3z_fSteTCcia2zAU,9379
32
+ code_puppy/command_line/prompt_toolkit_completion.py,sha256=saq1ZRjcxK8s2M-SKy-7I62xGC4Cpxdw02bvxbMwTxA,10010
33
33
  code_puppy/command_line/utils.py,sha256=7eyxDHjPjPB9wGDJQQcXV_zOsGdYsFgI0SGCetVmTqE,1251
34
34
  code_puppy/command_line/mcp/__init__.py,sha256=0-OQuwjq_pLiTVJ1_NrirVwdRerghyKs_MTZkwPC7YY,315
35
35
  code_puppy/command_line/mcp/add_command.py,sha256=RghGmOCjwwYJfrbLiV5UZojMA4-FNPlM04LKci0rpAw,6415
@@ -104,9 +104,9 @@ code_puppy/tui/screens/help.py,sha256=eJuPaOOCp7ZSUlecearqsuX6caxWv7NQszUh0tZJjB
104
104
  code_puppy/tui/screens/mcp_install_wizard.py,sha256=xqwN5omltMkfxWZwXj3D2PbXbtrxUi1dT0XT77oxOKk,27685
105
105
  code_puppy/tui/screens/settings.py,sha256=GMpv-qa08rorAE9mj3AjmqjZFPhmeJ_GWd-DBHG6iAA,10671
106
106
  code_puppy/tui/screens/tools.py,sha256=3pr2Xkpa9Js6Yhf1A3_wQVRzFOui-KDB82LwrsdBtyk,1715
107
- code_puppy-0.0.155.data/data/code_puppy/models.json,sha256=jNLDAGhbASNAhul64H4SMS5V4Y6QKW09WcNej4I_4oc,4034
108
- code_puppy-0.0.155.dist-info/METADATA,sha256=rbIPmM0KlIjWxYT4eGGWuHfstJ-cwMse9Iy1k_j1SCQ,19516
109
- code_puppy-0.0.155.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
110
- code_puppy-0.0.155.dist-info/entry_points.txt,sha256=d8YkBvIUxF-dHNJAj-x4fPEqizbY5d_TwvYpc01U5kw,58
111
- code_puppy-0.0.155.dist-info/licenses/LICENSE,sha256=31u8x0SPgdOq3izJX41kgFazWsM43zPEF9eskzqbJMY,1075
112
- code_puppy-0.0.155.dist-info/RECORD,,
107
+ code_puppy-0.0.157.data/data/code_puppy/models.json,sha256=dAfpMMI2EEeOMv0ynHSmMuJAYDLcZrs5gCLX3voC4-A,3252
108
+ code_puppy-0.0.157.dist-info/METADATA,sha256=NZLRr--sgoI8Mi0P8lHEzIMO4oLTP9vzTMFVOfYYYmg,19567
109
+ code_puppy-0.0.157.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
110
+ code_puppy-0.0.157.dist-info/entry_points.txt,sha256=d8YkBvIUxF-dHNJAj-x4fPEqizbY5d_TwvYpc01U5kw,58
111
+ code_puppy-0.0.157.dist-info/licenses/LICENSE,sha256=31u8x0SPgdOq3izJX41kgFazWsM43zPEF9eskzqbJMY,1075
112
+ code_puppy-0.0.157.dist-info/RECORD,,