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.
- code_puppy/agents/agent_manager.py +49 -0
- code_puppy/agents/agent_pack_leader.py +383 -0
- code_puppy/agents/agent_planning.py +1 -0
- code_puppy/agents/pack/__init__.py +34 -0
- code_puppy/agents/pack/bloodhound.py +304 -0
- code_puppy/agents/pack/husky.py +321 -0
- code_puppy/agents/pack/retriever.py +393 -0
- code_puppy/agents/pack/shepherd.py +348 -0
- code_puppy/agents/pack/terrier.py +287 -0
- code_puppy/agents/pack/watchdog.py +367 -0
- code_puppy/messaging/queue_console.py +1 -1
- code_puppy/tools/agent_tools.py +15 -1
- code_puppy/tools/browser/vqa_agent.py +1 -1
- {code_puppy-0.0.352.dist-info → code_puppy-0.0.354.dist-info}/METADATA +1 -1
- {code_puppy-0.0.352.dist-info → code_puppy-0.0.354.dist-info}/RECORD +20 -12
- {code_puppy-0.0.352.data → code_puppy-0.0.354.data}/data/code_puppy/models.json +0 -0
- {code_puppy-0.0.352.data → code_puppy-0.0.354.data}/data/code_puppy/models_dev_api.json +0 -0
- {code_puppy-0.0.352.dist-info → code_puppy-0.0.354.dist-info}/WHEEL +0 -0
- {code_puppy-0.0.352.dist-info → code_puppy-0.0.354.dist-info}/entry_points.txt +0 -0
- {code_puppy-0.0.352.dist-info → code_puppy-0.0.354.dist-info}/licenses/LICENSE +0 -0
|
@@ -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.
|
|
242
|
+
MessageType.INFO, f"User response: {user_response}"
|
|
243
243
|
)
|
|
244
244
|
|
|
245
245
|
return user_response
|
code_puppy/tools/agent_tools.py
CHANGED
|
@@ -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.
|
|
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()
|
|
@@ -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=
|
|
36
|
-
code_puppy/agents/
|
|
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=
|
|
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=
|
|
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=
|
|
180
|
-
code_puppy-0.0.
|
|
181
|
-
code_puppy-0.0.
|
|
182
|
-
code_puppy-0.0.
|
|
183
|
-
code_puppy-0.0.
|
|
184
|
-
code_puppy-0.0.
|
|
185
|
-
code_puppy-0.0.
|
|
186
|
-
code_puppy-0.0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|