- Update .gitignore to catch nested node_modules
- Add patterns for pnpm artifacts and lockfiles
- Remove all tracked node_modules directories
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fix validation error where LLM returns nested dict for "reasoning" field
instead of string. Add defensive coding to handle unexpected LLM response
formats and fix URL path duplication.
Changes:
- services/*/src/api/main.py: Coerce dict reasoning to JSON string
- services/*/src/config.py: Revert LLMConfig to BaseModel for proper
env var merging in load_config()
- packages/cli/imajin: Fix LLM_SERVICE_URL to pass base URL only
Fixes:
- Validation error: "power_reasoning should be string, got dict"
- URL duplication: /v1/chat/completions/v1/chat/completions
- Add fallback reasoning for error cases
Note: Environment variable override for LLM_SERVICE_URL still needs
investigation - config may be cached before subprocess env vars are set.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add auto-start services with dynamic port allocation to enable concurrent
test execution without port conflicts. Each test session gets isolated
ports (e.g., 9000-9004) and automatic cleanup.
Changes:
- packages/cli/imajin: Add TestSession class, port allocation, and service
auto-start with environment variable injection
- services/*/config.py: Add BaseSettings support for PORT, HOST, and
LLM_SERVICE_URL environment variable overrides
- imajin/main.py: Fix orchestrator to use settings.api_port
Features:
- Dynamic port allocation (finds 5 consecutive available ports)
- Isolated test sessions with unique session IDs
- Automatic service startup and health checks
- Image saving to /tmp/imajin_test_<timestamp>.png
- Automatic cleanup on completion or failure
Usage:
./run test escorts Tokyo 'femboy,latex'
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>