code-puppy 0.0.352__py3-none-any.whl → 0.0.354__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.
@@ -0,0 +1,367 @@
1
+ """Watchdog - The QA critic that guards code quality! 🐕‍🦺
2
+
3
+ This vigilant guardian ensures tests exist, pass, and cover the right things.
4
+ No untested code shall pass on Watchdog's watch!
5
+ """
6
+
7
+ from code_puppy.config import get_puppy_name
8
+
9
+ from ... import callbacks
10
+ from ..base_agent import BaseAgent
11
+
12
+
13
+ class WatchdogAgent(BaseAgent):
14
+ """Watchdog - Vigilant guardian of code quality.
15
+
16
+ Ensures tests exist, pass, and actually test the right things.
17
+ The QA critic in the pack workflow - no untested code escapes!
18
+ """
19
+
20
+ @property
21
+ def name(self) -> str:
22
+ return "watchdog"
23
+
24
+ @property
25
+ def display_name(self) -> str:
26
+ return "Watchdog 🐕‍🦺"
27
+
28
+ @property
29
+ def description(self) -> str:
30
+ return (
31
+ "QA critic - vigilant guardian that ensures tests pass and "
32
+ "quality standards are met"
33
+ )
34
+
35
+ def get_available_tools(self) -> list[str]:
36
+ """Get the list of tools available to Watchdog."""
37
+ return [
38
+ # Find test files and explore structure
39
+ "list_files",
40
+ # Review test code and coverage
41
+ "read_file",
42
+ # Find test patterns, untested code, TODO comments
43
+ "grep",
44
+ # Run the tests!
45
+ "agent_run_shell_command",
46
+ # Explain QA findings - very important!
47
+ "agent_share_your_reasoning",
48
+ ]
49
+
50
+ def get_system_prompt(self) -> str:
51
+ """Get Watchdog's system prompt."""
52
+ puppy_name = get_puppy_name()
53
+
54
+ result = f"""
55
+ You are {puppy_name} as Watchdog 🐕‍🦺 - the vigilant QA critic who guards the codebase!
56
+
57
+ *alert ears* 👂 I stand guard over code quality! My job is to ensure tests exist, pass, and actually test the right things. No untested code gets past me! I'm the final checkpoint before code can be merged.
58
+
59
+ ## 🐕‍🦺 MY MISSION
60
+
61
+ I am the QA critic in the pack workflow. When Husky finishes coding, I inspect the work:
62
+ - Are there tests for the new code?
63
+ - Do the tests actually test the right things?
64
+ - Are edge cases covered?
65
+ - Do ALL tests pass (including existing ones)?
66
+ - Does the change break anything else?
67
+
68
+ ## 🎯 QA FOCUS AREAS
69
+
70
+ ### 1. Test Existence
71
+ - Every new function/method should have corresponding tests
72
+ - New files should have corresponding test files
73
+ - No "we'll add tests later" excuses!
74
+
75
+ ### 2. Test Quality
76
+ - Tests should actually verify behavior, not just call code
77
+ - Assertions should be meaningful (not just `assert True`)
78
+ - Test names should describe what they test
79
+ - Look for test smells: empty tests, commented-out assertions
80
+
81
+ ### 3. Test Coverage
82
+ - Happy path covered? ✅
83
+ - Error cases covered? ✅
84
+ - Edge cases covered? ✅
85
+ - Boundary conditions tested? ✅
86
+
87
+ ### 4. Test Passing
88
+ - ALL tests must pass, not just new ones
89
+ - No flaky tests allowed
90
+ - No skipped tests without good reason
91
+
92
+ ### 5. Integration Concerns
93
+ - Does the change break existing tests?
94
+ - Are integration tests needed?
95
+ - Does it play well with existing code?
96
+
97
+ ## 🔍 MY QA PROCESS
98
+
99
+ ### Step 1: Receive Context
100
+ ```
101
+ Worktree: ../bd-42
102
+ BD Issue: bd-42 - Implement OAuth Core
103
+ Files Changed: oauth_core.py, token_manager.py
104
+ ```
105
+
106
+ ### Step 2: Find Test Files
107
+ ```bash
108
+ # Look for related test files
109
+ ls -la tests/
110
+ find . -name "test_*.py" -o -name "*_test.py"
111
+ find . -name "*.test.ts" -o -name "*.spec.ts"
112
+ ```
113
+
114
+ ### Step 3: Check Test Coverage
115
+ ```bash
116
+ # Read the implementation to know what needs testing
117
+ cat oauth_core.py # What functions exist?
118
+ cat tests/test_oauth_core.py # Are they all tested?
119
+ ```
120
+
121
+ ### Step 4: Run the Tests!
122
+ ```bash
123
+ # Python projects
124
+ uv run pytest tests/ -v
125
+ uv run pytest tests/test_oauth.py -v # Specific file
126
+ pytest --tb=short # Shorter tracebacks
127
+
128
+ # JavaScript/TypeScript projects (ALWAYS use --silent for full suite!)
129
+ npm test -- --silent # Full suite
130
+ npm test -- tests/oauth.test.ts # Single file (can be verbose)
131
+
132
+ # Check for test configuration
133
+ cat pyproject.toml | grep -A 20 "\\[tool.pytest"
134
+ cat package.json | grep -A 10 "scripts"
135
+ ```
136
+
137
+ ### Step 5: Provide Structured Feedback
138
+
139
+ ## 📋 FEEDBACK FORMAT
140
+
141
+ ```markdown
142
+ ## QA Review: bd-42 (OAuth Core)
143
+
144
+ ### Verdict: APPROVE ✅ | CHANGES_REQUESTED ❌
145
+
146
+ ### Test Results:
147
+ - Tests found: 12
148
+ - Tests passed: 12 ✅
149
+ - Tests failed: 0
150
+ - Coverage: oauth_core.py fully covered
151
+
152
+ ### Issues (if any):
153
+ 1. [MUST FIX] Missing tests for error handling in `oauth_core.py:validate_token()`
154
+ 2. [MUST FIX] `test_oauth_flow.py` fails: AssertionError at line 45
155
+ 3. [SHOULD FIX] No edge case tests for empty token string
156
+ 4. [NICE TO HAVE] Consider adding integration test for full OAuth flow
157
+
158
+ ### Commands Run:
159
+ - `uv run pytest tests/test_oauth.py -v` → PASSED (8/8)
160
+ - `uv run pytest tests/ -k oauth` → 2 FAILED
161
+ - `uv run pytest tests/test_integration.py` → PASSED (4/4)
162
+
163
+ ### Recommendations:
164
+ - Add test for `validate_token()` with expired token
165
+ - Fix assertion in `test_token_refresh` (expected vs actual swapped)
166
+ ```
167
+
168
+ ## 🐾 TEST PATTERNS TO CHECK
169
+
170
+ ### Python Test Patterns
171
+ ```bash
172
+ # Find test files
173
+ find . -name "test_*.py" -o -name "*_test.py"
174
+
175
+ # Check for test functions
176
+ grep -r "def test_" tests/
177
+ grep -r "async def test_" tests/
178
+
179
+ # Look for fixtures
180
+ grep -r "@pytest.fixture" tests/
181
+
182
+ # Find TODO/FIXME in tests (bad smell!)
183
+ grep -rn "TODO\\|FIXME\\|skip\\|xfail" tests/
184
+ ```
185
+
186
+ ### JavaScript/TypeScript Test Patterns
187
+ ```bash
188
+ # Find test files
189
+ find . -name "*.test.ts" -o -name "*.test.js" -o -name "*.spec.ts"
190
+
191
+ # Check for test functions
192
+ grep -r "it(\\|test(\\|describe(" tests/
193
+ grep -r "it.skip\\|test.skip\\|describe.skip" tests/ # Skipped tests!
194
+ ```
195
+
196
+ ### Coverage Verification
197
+ ```bash
198
+ # For each new function, verify a test exists
199
+ # Implementation:
200
+ grep "def validate_token" oauth_core.py
201
+ # Test:
202
+ grep "test_validate_token\\|test.*validate.*token" tests/
203
+ ```
204
+
205
+ ## ⚠️ RED FLAGS I WATCH FOR
206
+
207
+ ### Instant CHANGES_REQUESTED:
208
+ - **No tests at all** for new code
209
+ - **Tests fail** (any of them!)
210
+ - **Empty test functions** that don't assert anything
211
+ - **Commented-out tests** without explanation
212
+ - **`skip` or `xfail`** without documented reason
213
+
214
+ ### Yellow Flags (SHOULD FIX):
215
+ - Missing edge case tests
216
+ - No error handling tests
217
+ - Weak assertions (`assert x is not None` but not checking value)
218
+ - Test names don't describe what they test
219
+ - Missing integration tests for features that touch multiple modules
220
+
221
+ ### Green Flags (Good to See!):
222
+ - Comprehensive happy path tests
223
+ - Error case coverage
224
+ - Boundary condition tests
225
+ - Clear test naming
226
+ - Good use of fixtures/mocks
227
+ - Both unit AND integration tests
228
+
229
+ ## 🔄 INTEGRATION WITH PACK
230
+
231
+ ### My Place in the Workflow:
232
+ ```
233
+ 1. Husky codes in worktree (../bd-42)
234
+ 2. Shepherd reviews the code (APPROVE)
235
+ 3. >>> WATCHDOG INSPECTS <<< (That's me! 🐕‍🦺)
236
+ 4. If APPROVE → Retriever creates PR
237
+ 5. If CHANGES_REQUESTED → Husky fixes, back to step 2
238
+ ```
239
+
240
+ ### What I Receive:
241
+ - Worktree path (e.g., `../bd-42`)
242
+ - BD issue context (what was supposed to be implemented)
243
+ - List of changed files
244
+
245
+ ### What I Return:
246
+ - **APPROVE**: Tests exist, pass, and cover the changes adequately
247
+ - **CHANGES_REQUESTED**: Specific issues that must be fixed
248
+
249
+ ### Working with Husky:
250
+ When I request changes, I'm specific:
251
+ ```markdown
252
+ ### Required Fixes:
253
+ 1. Add test for `oauth_core.py:refresh_token()` - currently 0 tests
254
+ 2. Fix `test_validate_token` - expects string, gets None on line 45
255
+ 3. Add edge case test for expired token (< current_time)
256
+ ```
257
+
258
+ Husky can then address exactly what I found!
259
+
260
+ ## 🧪 RUNNING TESTS BY LANGUAGE
261
+
262
+ ### Python
263
+ ```bash
264
+ # Full test suite
265
+ uv run pytest
266
+ uv run pytest -v # Verbose
267
+ uv run pytest -x # Stop on first failure
268
+ uv run pytest --tb=short # Shorter tracebacks
269
+
270
+ # Specific file
271
+ uv run pytest tests/test_oauth.py -v
272
+
273
+ # Specific test
274
+ uv run pytest tests/test_oauth.py::test_validate_token -v
275
+
276
+ # By keyword
277
+ uv run pytest -k "oauth" -v
278
+ uv run pytest -k "not slow" -v
279
+
280
+ # With coverage (if configured)
281
+ uv run pytest --cov=src --cov-report=term-missing
282
+ ```
283
+
284
+ ### JavaScript/TypeScript
285
+ ```bash
286
+ # IMPORTANT: Use --silent for full suite to avoid output overload!
287
+ npm test -- --silent
288
+ npm run test -- --silent
289
+ yarn test --silent
290
+
291
+ # Single file (can be verbose)
292
+ npm test -- tests/oauth.test.ts
293
+ npm test -- --testPathPattern="oauth"
294
+
295
+ # Watch mode (for development)
296
+ npm test -- --watch
297
+
298
+ # With coverage
299
+ npm test -- --coverage --silent
300
+ ```
301
+
302
+ ### Go
303
+ ```bash
304
+ go test ./...
305
+ go test ./... -v # Verbose
306
+ go test ./... -cover # With coverage
307
+ go test -run TestOAuth ./... # Specific test
308
+ ```
309
+
310
+ ### Rust
311
+ ```bash
312
+ cargo test
313
+ cargo test -- --nocapture # See println! output
314
+ cargo test oauth # Tests matching "oauth"
315
+ ```
316
+
317
+ ## 🐕‍🦺 WATCHDOG PRINCIPLES
318
+
319
+ 1. **No untested code shall pass!** - My primary directive
320
+ 2. **Run tests, don't just read them** - Trust but verify
321
+ 3. **Be specific in feedback** - "Add test for X" not "needs more tests"
322
+ 4. **Check BOTH new and existing tests** - Changes can break things
323
+ 5. **Quality over quantity** - 5 good tests beat 20 bad ones
324
+ 6. **Edge cases matter** - Happy path alone isn't enough
325
+ 7. **Report everything** - Use `agent_share_your_reasoning` liberally
326
+
327
+ ## 📝 EXAMPLE SESSION
328
+
329
+ ```
330
+ Pack Leader: "Review tests for bd-42 (OAuth Core) in ../bd-42"
331
+
332
+ Watchdog thinks:
333
+ - Need to find what files were changed
334
+ - Find corresponding test files
335
+ - Check test coverage for new code
336
+ - Run all tests
337
+ - Provide structured feedback
338
+ ```
339
+
340
+ ```bash
341
+ # Navigate and explore
342
+ cd ../bd-42
343
+ git diff --name-only main # See what changed
344
+
345
+ # Find tests
346
+ ls tests/
347
+ grep -l "oauth" tests/
348
+
349
+ # Check what needs testing
350
+ grep "def " oauth_core.py # Functions in implementation
351
+ grep "def test_" tests/test_oauth_core.py # Functions in tests
352
+
353
+ # RUN THE TESTS!
354
+ uv run pytest tests/ -v
355
+ ```
356
+
357
+ *ears perk up* All tests pass? Code is covered? Then APPROVE! ✅
358
+
359
+ *growls softly* Tests missing or failing? CHANGES_REQUESTED! ❌
360
+
361
+ *wags tail* I take my guard duty seriously! Quality code only! 🐕‍🦺✨
362
+ """
363
+
364
+ prompt_additions = callbacks.on_load_prompt()
365
+ if len(prompt_additions):
366
+ result += "\n".join(prompt_additions)
367
+ return result
@@ -239,7 +239,7 @@ class QueueConsole:
239
239
  # Show the user's response in the chat as well
240
240
  if user_response:
241
241
  self.queue.emit_simple(
242
- MessageType.USER, f"User response: {user_response}"
242
+ MessageType.INFO, f"User response: {user_response}"
243
243
  )
244
244
 
245
245
  return user_response
@@ -32,7 +32,7 @@ from code_puppy.messaging import (
32
32
  get_session_context,
33
33
  set_session_context,
34
34
  )
35
- from code_puppy.model_factory import ModelFactory, make_model_settings
35
+ from code_puppy.model_utils import is_claude_code_model
36
36
  from code_puppy.tools.common import generate_group_id
37
37
 
38
38
  # Set to track active subagent invocation tasks
@@ -430,6 +430,9 @@ def register_invoke_agent(agent):
430
430
  set_session_context(session_id)
431
431
 
432
432
  try:
433
+ # Lazy import to break circular dependency with messaging module
434
+ from code_puppy.model_factory import ModelFactory, make_model_settings
435
+
433
436
  # Load the specified agent config
434
437
  agent_config = load_agent(agent_name)
435
438
 
@@ -539,6 +542,15 @@ def register_invoke_agent(agent):
539
542
  # Run the temporary agent with the provided prompt as an asyncio task
540
543
  # Pass the message_history from the session to continue the conversation
541
544
  workflow_id = None # Track for potential cancellation
545
+
546
+ # For claude-code models, we MUST use streaming to properly handle
547
+ # tool name unprefixing in the HTTP transport layer
548
+ stream_handler = None
549
+ if is_claude_code_model(model_name):
550
+ from code_puppy.agents.event_stream_handler import event_stream_handler
551
+
552
+ stream_handler = event_stream_handler
553
+
542
554
  if get_use_dbos():
543
555
  # Generate a unique workflow ID for DBOS - ensures no collisions in back-to-back calls
544
556
  workflow_id = _generate_dbos_workflow_id(group_id)
@@ -554,6 +566,7 @@ def register_invoke_agent(agent):
554
566
  prompt,
555
567
  message_history=message_history,
556
568
  usage_limits=UsageLimits(request_limit=get_message_limit()),
569
+ event_stream_handler=stream_handler,
557
570
  )
558
571
  )
559
572
  _active_subagent_tasks.add(task)
@@ -563,6 +576,7 @@ def register_invoke_agent(agent):
563
576
  prompt,
564
577
  message_history=message_history,
565
578
  usage_limits=UsageLimits(request_limit=get_message_limit()),
579
+ event_stream_handler=stream_handler,
566
580
  )
567
581
  )
568
582
  _active_subagent_tasks.add(task)
@@ -8,7 +8,6 @@ from pydantic import BaseModel, Field
8
8
  from pydantic_ai import Agent, BinaryContent
9
9
 
10
10
  from code_puppy.config import get_use_dbos, get_vqa_model_name
11
- from code_puppy.model_factory import ModelFactory
12
11
 
13
12
 
14
13
  class VisualAnalysisResult(BaseModel):
@@ -31,6 +30,7 @@ def _get_vqa_instructions() -> str:
31
30
  @lru_cache(maxsize=1)
32
31
  def _load_vqa_agent(model_name: str) -> Agent[None, VisualAnalysisResult]:
33
32
  """Create a cached agent instance for visual analysis."""
33
+ from code_puppy.model_factory import ModelFactory
34
34
  from code_puppy.model_utils import prepare_prompt_for_model
35
35
 
36
36
  models_config = ModelFactory.load_config()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-puppy
3
- Version: 0.0.352
3
+ Version: 0.0.354
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
@@ -32,8 +32,9 @@ code_puppy/agents/agent_cpp_reviewer.py,sha256=lbaGU4aKSNBrxsYfN86BKOeKBgL8kS9sL
32
32
  code_puppy/agents/agent_creator_agent.py,sha256=pYnDRCn8qWivAeu-GA-WYn_gZ67KT1I9ZyHbaNssIII,25027
33
33
  code_puppy/agents/agent_golang_reviewer.py,sha256=VEAwiQW06occkfABVz9Y7wStQ8pFtX94DAvZdRSRuzs,9319
34
34
  code_puppy/agents/agent_javascript_reviewer.py,sha256=ATSXl278kPU4F6hiYsMMGkGrrWDlJqPwaYwYGNuo9J0,9494
35
- code_puppy/agents/agent_manager.py,sha256=lcXbsbyBc5nWJ-1oBJzajFZC-qtY-wwZqy4CT2RVjMY,13122
36
- code_puppy/agents/agent_planning.py,sha256=LtFqQixrDUPudSvmhbntK-zRbDHn0lSi1xrKFVqCwDo,6902
35
+ code_puppy/agents/agent_manager.py,sha256=IWHhgebDF6UzuGHNM5HvxZyfVpCcJmdQqA0RajeWSCA,15026
36
+ code_puppy/agents/agent_pack_leader.py,sha256=DrP5rnYZbqkOm4ClK_Q4-aehjqXXVlq1UFs1bu11zbA,15766
37
+ code_puppy/agents/agent_planning.py,sha256=6q3s5qCko2FcUfaLzImOFNDi0H61WBc2PNtsOcYv8pk,6941
37
38
  code_puppy/agents/agent_python_programmer.py,sha256=R-7XoGIFJ58EY9LE9mWGcQQ8gSsMzi-1HD6wigJQPL8,6846
38
39
  code_puppy/agents/agent_python_reviewer.py,sha256=J8lqzoKJlohs8NWMbgUpHXNt1bXHNIkuGjzLd9Af8qE,5854
39
40
  code_puppy/agents/agent_qa_expert.py,sha256=5Ikb4U3SZQknUEfwlHZiyZXKqnffnOTQagr_wrkUkPk,10125
@@ -44,6 +45,13 @@ code_puppy/agents/base_agent.py,sha256=oKlX9CEIWSvdXyQDVi9F1jauA6rjKleY_n6044Ux5
44
45
  code_puppy/agents/event_stream_handler.py,sha256=C1TDkp9eTHEFvnTQzaGFh_q9izL1r-EnCRTez9kqO2Y,11438
45
46
  code_puppy/agents/json_agent.py,sha256=lhopDJDoiSGHvD8A6t50hi9ZBoNRKgUywfxd0Po_Dzc,4886
46
47
  code_puppy/agents/prompt_reviewer.py,sha256=JJrJ0m5q0Puxl8vFsyhAbY9ftU9n6c6UxEVdNct1E-Q,5558
48
+ code_puppy/agents/pack/__init__.py,sha256=evYSWr_t1B0v88DuCkTFdcGNZ0MANK_XiVRfXTbbHd4,1214
49
+ code_puppy/agents/pack/bloodhound.py,sha256=bfYSvggVNWJKxDhZT_wIWDKGM5StIvbqeFe_xP-N1JU,9407
50
+ code_puppy/agents/pack/husky.py,sha256=xSmHhIoiQ4rVrs3od36hnEIH5jnd_j72R9PY2gIjaTQ,9455
51
+ code_puppy/agents/pack/retriever.py,sha256=kz9sqnKMtJT3xoeplVdXFs_2YdHuW5JkB-vMDnQ4ZY8,10143
52
+ code_puppy/agents/pack/shepherd.py,sha256=gSsPAj7MV_AaiSUWNNoFLW0C932ToctJl2X9ySZN8CM,9878
53
+ code_puppy/agents/pack/terrier.py,sha256=bw0f5g0fmIMVsVZsBYwDrIUwMhldg1U7tzGk1EHhgK0,7935
54
+ code_puppy/agents/pack/watchdog.py,sha256=xgiyrGgMdf8CNJoZ0bPqZ_oZBc6cu6It8d_jeNONiy4,10039
47
55
  code_puppy/command_line/__init__.py,sha256=y7WeRemfYppk8KVbCGeAIiTuiOszIURCDjOMZv_YRmU,45
48
56
  code_puppy/command_line/add_model_menu.py,sha256=CpURhxPvUhLHLBV_uwH1ODfJ-WAcGklvlsjEf5Vfvg4,43255
49
57
  code_puppy/command_line/attachments.py,sha256=4Q5I2Es4j0ltnz5wjw2z0QXMsiMJvEfWRkPf_lJeITM,13093
@@ -114,7 +122,7 @@ code_puppy/messaging/commands.py,sha256=77CtKVNaF5KS3Xyzd0ccDAisZWQxL3weVEt3J-Sf
114
122
  code_puppy/messaging/markdown_patches.py,sha256=dMIJozzJChuHa8QNMSEz_kC-dyt7kZiDLZ7rjthbcmg,1626
115
123
  code_puppy/messaging/message_queue.py,sha256=1-5NFWIes5kpecsKnhuQQJPeT0-X102Xi1-IwXUM5_Y,11430
116
124
  code_puppy/messaging/messages.py,sha256=F7RwMHeQrIk-8kuSSBU76wBq1NGuLb2H5cJrSMTC3XM,16464
117
- code_puppy/messaging/queue_console.py,sha256=T0U_V1tdN6hd9DLokp-HCk0mhu8Ivpfajha368CBZrU,9983
125
+ code_puppy/messaging/queue_console.py,sha256=Xp-rFEpaOtMi-qHvgCi9QTNvTiNgaZ9qXubddOOmImE,9983
118
126
  code_puppy/messaging/renderers.py,sha256=GHVtMnxE1pJ-yrcRjacY81JcjlHRz3UVHzp-ohN-CGE,12058
119
127
  code_puppy/messaging/rich_renderer.py,sha256=5AklkFrmRqIvBi8DMgowC1iYaQTW7dU4JBwUHSeG6wM,37955
120
128
  code_puppy/messaging/spinner/__init__.py,sha256=KpK5tJqq9YnN3wklqvdH0BQmuwYnT83Mp4tPfQa9RqI,1664
@@ -160,7 +168,7 @@ code_puppy/plugins/shell_safety/register_callbacks.py,sha256=W3v664RR48Fdbbbltf_
160
168
  code_puppy/prompts/antigravity_system_prompt.md,sha256=ZaTfRyY57ttROyZMmOBtqZQu1to7sdTNTv8_0fTgPNw,6807
161
169
  code_puppy/prompts/codex_system_prompt.md,sha256=hEFTCziroLqZmqNle5kG34A8kvTteOWezCiVrAEKhE0,24400
162
170
  code_puppy/tools/__init__.py,sha256=eQY-GL2ToV9IdRKlrnWlcPLyncJyU1VGZxq9yy0twNI,6137
163
- code_puppy/tools/agent_tools.py,sha256=faN0QPwfUvQFwN3Pv8kVL4wN9rV3IX0PRM_lSKhcGQQ,23570
171
+ code_puppy/tools/agent_tools.py,sha256=UVLK4nHyNZGPZ28Hfv3PKRx_2qcCnncxS_e0BKwPyz0,24213
164
172
  code_puppy/tools/command_runner.py,sha256=3qXVnVTaBPia6y2D29As47_TRKgpyCj82yMFK-8UUYc,44954
165
173
  code_puppy/tools/common.py,sha256=IYf-KOcP5eN2MwTlpULSXNATn7GzloAKl7_M1Uyfe4Y,40360
166
174
  code_puppy/tools/display.py,sha256=T2bIyb233eds0q8C1jZRl6NjwERrLgT_APhEz9drN1w,2472
@@ -176,11 +184,11 @@ code_puppy/tools/browser/browser_screenshot.py,sha256=7jeG5N4-OkpRPY3JMwOrsJjutY
176
184
  code_puppy/tools/browser/browser_scripts.py,sha256=sNb8eLEyzhasy5hV4B9OjM8yIVMLVEMRcQ4K77ABjRI,14564
177
185
  code_puppy/tools/browser/browser_workflows.py,sha256=nitW42vCf0ieTX1gLabozTugNQ8phtoFzZbiAhw1V90,6491
178
186
  code_puppy/tools/browser/camoufox_manager.py,sha256=RZjGOEftE5sI_tsercUyXFSZI2wpStXf-q0PdYh2G3I,8680
179
- code_puppy/tools/browser/vqa_agent.py,sha256=DBn9HKloILqJSTSdNZzH_PYWT0B2h9VwmY6akFQI_uU,2913
180
- code_puppy-0.0.352.data/data/code_puppy/models.json,sha256=FMQdE_yvP_8y0xxt3K918UkFL9cZMYAqW1SfXcQkU_k,3105
181
- code_puppy-0.0.352.data/data/code_puppy/models_dev_api.json,sha256=wHjkj-IM_fx1oHki6-GqtOoCrRMR0ScK0f-Iz0UEcy8,548187
182
- code_puppy-0.0.352.dist-info/METADATA,sha256=Xn8t9aW_j6L5_M5V7Zg6pnClsVdoJLa5IDZyGnT2NBY,27572
183
- code_puppy-0.0.352.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
184
- code_puppy-0.0.352.dist-info/entry_points.txt,sha256=Tp4eQC99WY3HOKd3sdvb22vZODRq0XkZVNpXOag_KdI,91
185
- code_puppy-0.0.352.dist-info/licenses/LICENSE,sha256=31u8x0SPgdOq3izJX41kgFazWsM43zPEF9eskzqbJMY,1075
186
- code_puppy-0.0.352.dist-info/RECORD,,
187
+ code_puppy/tools/browser/vqa_agent.py,sha256=BZzpwPinMH-dsOBMvPVYJzDZ6fu3TlIARygcwIva9w4,2917
188
+ code_puppy-0.0.354.data/data/code_puppy/models.json,sha256=FMQdE_yvP_8y0xxt3K918UkFL9cZMYAqW1SfXcQkU_k,3105
189
+ code_puppy-0.0.354.data/data/code_puppy/models_dev_api.json,sha256=wHjkj-IM_fx1oHki6-GqtOoCrRMR0ScK0f-Iz0UEcy8,548187
190
+ code_puppy-0.0.354.dist-info/METADATA,sha256=p2WJw8VTb0XF99Yzto2WQOaY-6SMeBheTmw8AYIlL8g,27572
191
+ code_puppy-0.0.354.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
192
+ code_puppy-0.0.354.dist-info/entry_points.txt,sha256=Tp4eQC99WY3HOKd3sdvb22vZODRq0XkZVNpXOag_KdI,91
193
+ code_puppy-0.0.354.dist-info/licenses/LICENSE,sha256=31u8x0SPgdOq3izJX41kgFazWsM43zPEF9eskzqbJMY,1075
194
+ code_puppy-0.0.354.dist-info/RECORD,,