turbo 2.6.1 β€’ Packages in scope: @my-roadtrip/api β€’ Running test:unit in 1 packages β€’ Remote caching disabled @my-roadtrip/api:test:unit: cache bypass, force executing 5f7a3bd0494645d7 @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: > @my-roadtrip/api@2.0.0 test:unit /Users/floriansola/Documents/MyRoadTrip/apps/api @my-roadtrip/api:test:unit: > vitest run @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: RUN v2.1.9 /Users/floriansola/Documents/MyRoadTrip/apps/api @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ› οΈ run anywhere with `dotenvx run -- yourcommand` @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.integration.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ› οΈ run anywhere with `dotenvx run -- yourcommand` @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/overpass.service.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ” prevent committing .env to code: https://dotenvx.com/precommit @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/common/handlers/__tests__/error-handler.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ“‘ add observability to secrets: https://dotenvx.com/ops @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/live/__tests__/liveReplay.builder.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ› οΈ run anywhere with `dotenvx run -- yourcommand` @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.routes.integration.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: βš™οΈ load multiple .env files with { path: ['.env.local', '.env'] } @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.worker.integration.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: βš™οΈ write to custom object with { processEnv: myObject } @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/analytics/__tests__/analytics.service.spec.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ”‘ add access controls to secrets: https://dotenvx.com/ops @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/google-places.service.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: βš™οΈ write to custom object with { processEnv: myObject } @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.controller.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: βš™οΈ load multiple .env files with { path: ['.env.local', '.env'] } @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ—‚οΈ backup and recover secrets: https://dotenvx.com/ops @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (35) from .env -- tip: πŸ› οΈ run anywhere with `dotenvx run -- yourcommand` @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/live/__tests__/liveReplay.builder.test.ts (4 tests) 3ms @my-roadtrip/api:test:unit: βœ“ src/common/handlers/__tests__/error-handler.test.ts (31 tests) 13ms @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (35) from .env -- tip: βš™οΈ enable debug logging with { debug: true } @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/overpass.service.test.ts > OverpassService > searchNearby > should find viewpoints near a location @my-roadtrip/api:test:unit: stderr | src/services/__tests__/overpass.service.test.ts > OverpassService > searchNearby > should handle API errors gracefully @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.237Z","level":"debug","service":"OverpassService","message":"Overpass query","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":112,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:112:14)"},"query":"[out:json][timeout:25];\n(\n node[tourism=\"viewpoint\"](around:10000,48.8566,2.3522);\n node[natural=\"peak\"](around:10000,48.8566,2.3522);\n node[natural=\"cliff\"](around:10000,48.8566,2.3522);\n node[hi"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.240Z","level":"info","service":"OverpassService","message":"Overpass results","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":133,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:133:14)"},"count":2,"categories":["viewpoint","monument"],"radiusKm":"10.0"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.242Z","level":"error","service":"OverpassService","message":"Overpass search error","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":145,"column":16,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:145:16)"},"error":{"name":"Error","message":"Overpass API error: 429 Too Many Requests","stack":"Error: Overpass API error: 429 Too Many Requests\n at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:128:15)\n at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/__tests__/overpass.service.test.ts:84:23\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:533:5\n at runTest (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:1056:11)\n at runSuite (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:1205:15)"},"location":{"lat":48.8566,"lng":2.3522},"categories":["viewpoint"]} @my-roadtrip/api:test:unit: stdout | src/services/__tests__/overpass.service.test.ts > OverpassService > searchNearby > should handle empty results @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.242Z","level":"debug","service":"OverpassService","message":"Overpass query","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":112,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:112:14)"},"query":"[out:json][timeout:25];\n(\n node[historic=\"castle\"](around:5000,48.8566,2.3522);\n node[historic=\"manor\"](around:5000,48.8566,2.3522);\n node[historic=\"fort\"](around:5000,48.8566,2.3522);\n);"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.242Z","level":"info","service":"OverpassService","message":"Overpass results","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":133,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:133:14)"},"count":0,"categories":["castle"],"radiusKm":"5.0"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/overpass.service.test.ts > OverpassService > searchNearby > should handle API errors gracefully @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.242Z","level":"debug","service":"OverpassService","message":"Overpass query","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":112,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:112:14)"},"query":"[out:json][timeout:25];\n(\n node[tourism=\"viewpoint\"](around:5000,48.8566,2.3522);\n node[natural=\"peak\"](around:5000,48.8566,2.3522);\n node[natural=\"cliff\"](around:5000,48.8566,2.3522);\n);"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stderr | src/services/__tests__/overpass.service.test.ts > OverpassService > searchNearby > should timeout after 25 seconds @my-roadtrip/api:test:unit: stdout | src/services/__tests__/overpass.service.test.ts > OverpassService > searchNearby > should timeout after 25 seconds @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.243Z","level":"debug","service":"OverpassService","message":"Overpass query","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":112,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:112:14)"},"query":"[out:json][timeout:25];\n(\n node[tourism=\"viewpoint\"](around:5000,48.8566,2.3522);\n node[natural=\"peak\"](around:5000,48.8566,2.3522);\n node[natural=\"cliff\"](around:5000,48.8566,2.3522);\n);"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/overpass.service.test.ts > OverpassService > searchNearby > should map categories to OSM tags correctly @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.245Z","level":"debug","service":"OverpassService","message":"Overpass query","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":112,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:112:14)"},"query":"[out:json][timeout:25];\n(\n node[historic=\"castle\"](around:10000,48.8566,2.3522);\n node[historic=\"manor\"](around:10000,48.8566,2.3522);\n node[historic=\"fort\"](around:10000,48.8566,2.3522);\n node[na"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.245Z","level":"info","service":"OverpassService","message":"Overpass results","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":133,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:133:14)"},"count":0,"categories":["castle","waterfall","beach"],"radiusKm":"10.0"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:20:22.243Z","level":"error","service":"OverpassService","message":"Overpass API timeout","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":143,"column":16,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:143:16)"},"location":{"lat":48.8566,"lng":2.3522},"radiusMeters":5000} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/overpass.service.test.ts > OverpassService > category mappings > should map nature categories correctly @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.247Z","level":"debug","service":"OverpassService","message":"Overpass query","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":112,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:112:14)"},"query":"[out:json][timeout:25];\n(\n node[natural=\"waterfall\"](around:10000,45,6);\n node[natural=\"peak\"](around:10000,45,6);\n node[natural=\"volcano\"](around:10000,45,6);\n node[natural=\"water\"](around:10000,"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.247Z","level":"info","service":"OverpassService","message":"Overpass results","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":133,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:133:14)"},"count":0,"categories":["waterfall","mountain","lake"],"radiusKm":"10.0"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/overpass.service.test.ts > OverpassService > category mappings > should map heritage categories correctly @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.247Z","level":"debug","service":"OverpassService","message":"Overpass query","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":112,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:112:14)"},"query":"[out:json][timeout:25];\n(\n node[historic=\"castle\"](around:10000,45,6);\n node[historic=\"manor\"](around:10000,45,6);\n node[historic=\"fort\"](around:10000,45,6);\n node[historic=\"monument\"](around:1000"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.247Z","level":"info","service":"OverpassService","message":"Overpass results","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":133,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:133:14)"},"count":0,"categories":["castle","monument","ruins"],"radiusKm":"10.0"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/overpass.service.test.ts > OverpassService > result transformation > should calculate uniqueness scores correctly @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.248Z","level":"debug","service":"OverpassService","message":"Overpass query","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":112,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:112:14)"},"query":"[out:json][timeout:25];\n(\n node[natural=\"waterfall\"](around:10000,45,6);\n);\nout body;\n>;"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.248Z","level":"info","service":"OverpassService","message":"Overpass results","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":133,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:133:14)"},"count":2,"categories":["waterfall"],"radiusKm":"10.0"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/overpass.service.test.ts > OverpassService > result transformation > should deduplicate results by name @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.248Z","level":"debug","service":"OverpassService","message":"Overpass query","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":112,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:112:14)"},"query":"[out:json][timeout:25];\n(\n node[natural=\"peak\"](around:10000,45,6);\n node[natural=\"volcano\"](around:10000,45,6);\n);\nout body;"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.248Z","level":"info","service":"OverpassService","message":"Overpass results","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":133,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:133:14)"},"count":2,"categories":["mountain"],"radiusKm":"10.0"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/analytics/__tests__/analytics.service.spec.ts (2 tests) 70ms @my-roadtrip/api:test:unit: stdout | src/services/__tests__/overpass.service.test.ts > OverpassService > result transformation > should limit results to 20 @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.248Z","level":"debug","service":"OverpassService","message":"Overpass query","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":112,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:112:14)"},"query":"[out:json][timeout:25];\n(\n node[tourism=\"attraction\"](around:10000,45,6);\n node[tourism=\"viewpoint\"](around:10000,45,6);\n node[historic=\"monument\"](around:10000,45,6);\n);"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.249Z","level":"info","service":"OverpassService","message":"Overpass results","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts","line":133,"column":14,"frame":"at OverpassService.searchNearby (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/overpass.service.ts:133:14)"},"count":50,"categories":["poi"],"radiusKm":"10.0"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/services/__tests__/overpass.service.test.ts (14 tests) 14ms @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.controller.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (35) from .env -- tip: πŸ—‚οΈ backup and recover secrets: https://dotenvx.com/ops @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.251Z","level":"info","service":"redis-config","message":"Forcing Upstash Redis (REDIS_DRIVER=upstash)","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts","line":51,"column":12,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts:51:12"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.controller.test.ts @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.284Z","level":"info","service":"redis","message":"Using Upstash Redis client","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts","line":36,"column":12,"frame":"at new UpstashRedisAdapter (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts:36:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.integration.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (35) from .env -- tip: βœ… audit secrets and track compliance: https://dotenvx.com/ops @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.worker.integration.test.ts > AI Worker Integration Tests > suggest-pois worker > uses OpenAI suggestions when available @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.278Z","level":"info","service":"ai-worker","message":"AI Worker starting","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts","line":25,"column":8,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts:25:8"},"poiConcurrency":1,"planConcurrency":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.281Z","level":"info","service":"ai-worker","message":"AI worker processors initialized","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts","line":100,"column":8,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts:100:8"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.284Z","level":"warn","service":"AIProcessor","message":"Cache check failed, proceeding with generation","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1135,"column":14,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1135:14)"},"cacheError":{"name":"TypeError","message":"repository.getCachedResult is not a function","stack":"TypeError: repository.getCachedResult is not a function\n at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1107:39)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.284Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"cacheKey":"ai:cache:poi:paris","location":{"lat":48.8566,"lng":2.3522},"categories":["viewpoint"],"radiusKm":5,"tier":"premium","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.284Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":0,"timeMs":0,"categories":["viewpoint"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.287Z","level":"info","service":"AIProcessor","message":"Database insufficient - generating with AI","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1236,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1236:12)"},"databaseResults":0,"needed":15,"suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.288Z","level":"info","service":"AIProcessor","message":"Overpass suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1300,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1300:18"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.288Z","level":"info","service":"AIProcessor","message":"Mapbox suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1366,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1366:16"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.288Z","level":"info","service":"AIProcessor","message":"OpenAI suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1279,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1279:18"},"count":1,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.288Z","level":"info","service":"AIProcessor","message":"Combined suggestions from sources","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1481,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1481:10)"},"rawCount":1,"afterDedup":1,"withinRadius":1,"sources":["openai","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.288Z","level":"info","service":"AIProcessor","message":"Verifying POIs with tier-based verification","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":488,"column":10,"frame":"at verifyAndScorePoisWithTier (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:488:10)"},"total":1,"unique":1,"withinRadius":1,"verificationPool":1,"limit":60,"radiusKm":5,"sources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.289Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Le Marais District","lat":48.8592,"lng":2.3617,"category":"viewpoint"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.289Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Le Marais District","distanceKm":"0.75","confidence":63,"relevance":74,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.8592,"lng":2.3617}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.289Z","level":"info","service":"AIProcessor","message":"πŸ’Ύ Saving POIs to permanent database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1713,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1713:12)"},"count":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.289Z","level":"info","service":"AIProcessor","message":"Generated POI suggestions with tier-based strategy","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1772,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1772:10)"},"poisCount":1,"processingTimeMs":7,"tier":"premium","suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"],"planId":"plan-1","stageId":"stage-1"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.integration.test.ts @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.294Z","level":"info","service":"redis-config","message":"Forcing Upstash Redis (REDIS_DRIVER=upstash)","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts","line":51,"column":12,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts:51:12"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.297Z","level":"info","service":"redis","message":"Using Upstash Redis client","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts","line":36,"column":12,"frame":"at new UpstashRedisAdapter (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts:36:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.worker.integration.test.ts > AI Worker Integration Tests > suggest-pois worker > falls back to Mapbox Places when OpenAI fails @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.310Z","level":"info","service":"ai-worker","message":"AI Worker starting","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts","line":25,"column":8,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts:25:8"},"poiConcurrency":1,"planConcurrency":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.310Z","level":"info","service":"ai-worker","message":"AI worker processors initialized","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts","line":100,"column":8,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts:100:8"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.311Z","level":"warn","service":"AIProcessor","message":"Cache check failed, proceeding with generation","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1135,"column":14,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1135:14)"},"cacheError":{"name":"TypeError","message":"repository.getCachedResult is not a function","stack":"TypeError: repository.getCachedResult is not a function\n at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1107:39)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.311Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"cacheKey":"fallback-cache-key","location":{"lat":48.8566,"lng":2.3522},"categories":["activity"],"radiusKm":5,"tier":"standard","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.311Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":0,"timeMs":0,"categories":["activity"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.311Z","level":"info","service":"AIProcessor","message":"Database insufficient - generating with AI","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1236,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1236:12)"},"databaseResults":0,"needed":15,"suggestionSources":["overpass","mapbox"],"verificationSources":["mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.312Z","level":"info","service":"AIProcessor","message":"Overpass suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1300,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1300:18"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.312Z","level":"info","service":"AIProcessor","message":"Mapbox suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1366,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1366:16"},"count":1,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.312Z","level":"info","service":"AIProcessor","message":"Combined suggestions from sources","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1481,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1481:10)"},"rawCount":1,"afterDedup":1,"withinRadius":1,"sources":["overpass","mapbox"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.312Z","level":"info","service":"AIProcessor","message":"Verifying POIs with tier-based verification","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":488,"column":10,"frame":"at verifyAndScorePoisWithTier (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:488:10)"},"total":1,"unique":1,"withinRadius":1,"verificationPool":1,"limit":60,"radiusKm":5,"sources":["mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.312Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Place de la RΓ©publique","lat":48.8676,"lng":2.3631,"category":"activity"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.312Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Place de la RΓ©publique","distanceKm":"1.46","confidence":40,"relevance":51,"matchCount":1,"sources":["mapbox","overpass"],"googleMatched":null,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.8676,"lng":2.3631}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.312Z","level":"debug","service":"AIProcessor","message":"Filtering out low-confidence POI: Place de la RΓ©publique (confidence: 40, min: 60, radius: 5km)","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":750,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:750:16"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.312Z","level":"warn","service":"AIProcessor","message":"Verification returned 0 POIs - using unverified quick fallback","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1598,"column":14,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1598:14)"},"quickCandidates":1,"returned":1,"radiusKm":5,"dynamicThreshold":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.312Z","level":"info","service":"AIProcessor","message":"POI database save skipped","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1734,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1734:12)"},"count":1,"usedUnverifiedFallback":true,"databaseEnabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.312Z","level":"info","service":"AIProcessor","message":"Generated POI suggestions with tier-based strategy","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1772,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1772:10)"},"poisCount":1,"processingTimeMs":1,"tier":"standard","suggestionSources":["overpass","mapbox"],"verificationSources":["mapbox","overpass"]} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.worker.integration.test.ts > AI Worker Integration Tests > suggest-pois worker > uses database fallback when both providers fail @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.324Z","level":"info","service":"ai-worker","message":"AI Worker starting","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts","line":25,"column":8,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts:25:8"},"poiConcurrency":1,"planConcurrency":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.324Z","level":"info","service":"ai-worker","message":"AI worker processors initialized","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts","line":100,"column":8,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts:100:8"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.324Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"location":{"lat":48.8566,"lng":2.3522},"categories":["restaurant"],"radiusKm":5,"tier":"standard","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.324Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":15,"timeMs":0,"categories":["restaurant"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.324Z","level":"info","service":"AIProcessor","message":"βœ… Database has sufficient POIs - skipping AI generation","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1201,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1201:12)"},"count":15,"saved":"AI call + verification","minDatabaseResults":15} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.worker.integration.test.ts > AI Worker Integration Tests > enhance-plan worker > enhances plans and writes updates to Firestore @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.335Z","level":"info","service":"ai-worker","message":"AI Worker starting","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts","line":25,"column":8,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts:25:8"},"poiConcurrency":1,"planConcurrency":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.335Z","level":"info","service":"ai-worker","message":"AI worker processors initialized","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts","line":100,"column":8,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts:100:8"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.335Z","level":"info","service":"ai-worker","message":"βœ… Plan plan-1 enhanced successfully in 0ms","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts","line":81,"column":12,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts:81:12"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/google-places.service.test.ts > GooglePlacesService > verifyPlace > should verify a place successfully @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.335Z","level":"debug","service":"GooglePlacesService","message":"Processing batch of 1 verifications","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts","line":108,"column":12,"frame":"at GooglePlacesService.processBatch (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts:108:12)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.338Z","level":"debug","service":"GooglePlacesService","message":"Google Places verification result","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts","line":208,"column":14,"frame":"at GooglePlacesService.verifyPlaceImmediate (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts:208:14)"},"query":"Tour Eiffel","matched":true,"confidence":99,"distanceMeters":0,"placeId":"ChIJ123"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.worker.integration.test.ts > AI Worker Integration Tests > enhance-plan worker > propagates errors when enhancement fails @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.350Z","level":"info","service":"ai-worker","message":"AI Worker starting","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts","line":25,"column":8,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts:25:8"},"poiConcurrency":1,"planConcurrency":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.351Z","level":"info","service":"ai-worker","message":"AI worker processors initialized","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts","line":100,"column":8,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts:100:8"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stderr | src/modules/ai/__tests__/ai.worker.integration.test.ts > AI Worker Integration Tests > enhance-plan worker > propagates errors when enhancement fails @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.351Z","level":"error","service":"ai-worker","message":"Failed to enhance plan","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts","line":95,"column":12,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/queue/ai.worker.ts:95:12"},"planId":"plan-404","error":{"name":"Error","message":"API error","stack":"Error: API error\n at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/__tests__/ai.worker.integration.test.ts:362:59\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:533:11\n at runWithTimeout (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:39:7)\n at runTest (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:1056:17)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/ai/__tests__/ai.worker.integration.test.ts (5 tests) 183ms @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/dashboard-insights.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ“‘ add observability to secrets: https://dotenvx.com/ops @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Basic Prompt Building > should generate POIs with basic context @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.377Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.380Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Basic Prompt Building > should enforce strict distance constraints in prompt @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.381Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.381Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Basic Prompt Building > should require 90%+ confidence for inclusion @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.381Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.381Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Enhanced Context - Route Information > should include route context when provided @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.381Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.381Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Enhanced Context - Route Information > should include coordinates for route endpoints @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.382Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.382Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Enhanced Context - Timing > should include departure and arrival times @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.383Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.383Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Enhanced Context - Trip Information > should include plan name @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.383Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.383Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Enhanced Context - Existing Stages > should include existing stages to avoid duplicates @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.383Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.383Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Enhanced Context - Existing Stages > should list stage types to avoid @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.384Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.384Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Enhanced Context - Existing Stages > should limit stage names to first 5 @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.384Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.384Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Full Context Integration > should combine all context types in one prompt @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.385Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.385Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Language Settings > should default to French language @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.385Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.385Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Language Settings > should respect custom language preference @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.385Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.385Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Error Handling > should handle invalid JSON response @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.386Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.386Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Error Handling > should handle non-array response @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.387Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.387Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Error Handling > should reject invalid coordinates @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.387Z","level":"info","service":"AIModelSelector","message":"Using tier default model","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts","line":59,"column":12,"frame":"at AIModelSelector.selectModel (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/aiModelSelector.service.ts:59:12)"},"model":"gpt-4o-mini","userTier":"standard"} @my-roadtrip/api:test:unit: stderr | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Error Handling > should handle invalid JSON response @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.386Z","level":"error","service":"OpenAIService","message":"Failed to parse OpenAI POI response","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":347,"column":16,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:347:16)"},"content":"Invalid JSON {{{","error":{"name":"SyntaxError","message":"Unexpected token 'I', \"Invalid JSON {{{\" is not valid JSON","stack":"SyntaxError: Unexpected token 'I', \"Invalid JSON {{{\" is not valid JSON\n at JSON.parse ()\n at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:345:23)\n at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/__tests__/openai-enhanced-context.test.ts:278:7\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:533:5\n at runTest (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:1056:11)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.387Z","level":"info","service":"OpenAIService","message":"Generating POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":307,"column":12,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:307:12)"},"model":"gpt-4o-mini","modelDisplayName":"Explorer IA","userTier":"standard","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.386Z","level":"error","service":"OpenAIService","message":"Failed to generate POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":455,"column":14,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:455:14)"},"error":{"name":"Error","message":"Failed to parse OpenAI response - invalid JSON format","stack":"Error: Failed to parse OpenAI response - invalid JSON format\n at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:348:15)\n at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/__tests__/openai-enhanced-context.test.ts:278:7\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:533:5\n at runTest (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:1056:11)\n at runSuite (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:1205:15)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stderr | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Error Handling > should handle non-array response @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.387Z","level":"error","service":"OpenAIService","message":"Failed to generate POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":455,"column":14,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:455:14)"},"error":{"name":"TypeError","message":"Invalid response format: expected an array of POIs","stack":"TypeError: Invalid response format: expected an array of POIs\n at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:352:15)\n at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/__tests__/openai-enhanced-context.test.ts:288:7\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:533:5\n at runTest (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:1056:11)\n at runSuite (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:1205:15)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stderr | src/services/__tests__/openai-enhanced-context.test.ts > OpenAI Service - Enhanced Prompt Context > Error Handling > should reject invalid coordinates @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.387Z","level":"error","service":"OpenAIService","message":"Failed to generate POI suggestions","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts","line":455,"column":14,"frame":"at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:455:14)"},"error":{"name":"TypeError","message":"POI 0 \"Bad POI\": Invalid coordinates (lat=999, lng=999)","stack":"TypeError: POI 0 \"Bad POI\": Invalid coordinates (lat=999, lng=999)\n at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:398:19\n at Array.map ()\n at OpenAIService.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/openai.service.ts:361:10)\n at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/__tests__/openai-enhanced-context.test.ts:310:7\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:533:5"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/services/__tests__/openai-enhanced-context.test.ts (16 tests) 11ms @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.389Z","level":"info","service":"redis-config","message":"Forcing Upstash Redis (REDIS_DRIVER=upstash)","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts","line":51,"column":12,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts:51:12"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.391Z","level":"info","service":"redis","message":"Using Upstash Redis client","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts","line":36,"column":12,"frame":"at new UpstashRedisAdapter (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts:36:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/planner/__tests__/dashboard-insights.test.ts (3 tests) 4ms @my-roadtrip/api:test:unit: stdout | src/common/utils/__tests__/logger.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: βš™οΈ load multiple .env files with { path: ['.env.local', '.env'] } @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/gamification/__tests__/progress-updates.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: βœ… audit secrets and track compliance: https://dotenvx.com/ops @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/openai-issue-006.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: βš™οΈ enable debug logging with { debug: true } @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/common/utils/__tests__/logger.test.ts (12 tests) 11ms @my-roadtrip/api:test:unit: βœ“ src/services/__tests__/openai-issue-006.test.ts (16 tests) 2ms @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts > POI Processor - Enhanced Context > Multi-source Verification > should verify POIs with both Google and Mapbox @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.404Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10,"tier":"premium","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.405Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":0,"timeMs":0,"categories":["restaurant","viewpoint"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.406Z","level":"info","service":"AIProcessor","message":"Database insufficient - generating with AI","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1236,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1236:12)"},"databaseResults":0,"needed":15,"suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.406Z","level":"info","service":"AIProcessor","message":"Overpass suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1300,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1300:18"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.406Z","level":"info","service":"AIProcessor","message":"Mapbox suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1366,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1366:16"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.406Z","level":"info","service":"AIProcessor","message":"OpenAI suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1279,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1279:18"},"count":2,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.406Z","level":"info","service":"AIProcessor","message":"Combined suggestions from sources","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1481,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1481:10)"},"rawCount":2,"afterDedup":2,"withinRadius":2,"sources":["openai","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.407Z","level":"info","service":"AIProcessor","message":"Verifying POIs with tier-based verification","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":488,"column":10,"frame":"at verifyAndScorePoisWithTier (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:488:10)"},"total":2,"unique":2,"withinRadius":2,"verificationPool":2,"limit":60,"radiusKm":10,"sources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.408Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 1","lat":48.8584,"lng":2.2945,"category":"restaurant"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.409Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 1","distanceKm":"0.00","confidence":86,"relevance":89,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.409Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 2","lat":48.859,"lng":2.295,"category":"viewpoint"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.409Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 2","distanceKm":"0.08","confidence":83,"relevance":84,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.859,"lng":2.295}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.409Z","level":"info","service":"AIProcessor","message":"πŸ’Ύ Saving POIs to permanent database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1713,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1713:12)"},"count":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.409Z","level":"info","service":"AIProcessor","message":"Generated POI suggestions with tier-based strategy","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1772,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1772:10)"},"poisCount":2,"processingTimeMs":6,"tier":"premium","suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts > POI Processor - Enhanced Context > Multi-source Verification > should calculate agreement bonus when both sources match @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.410Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10,"tier":"premium","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.411Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":0,"timeMs":0,"categories":["restaurant","viewpoint"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.411Z","level":"info","service":"AIProcessor","message":"Database insufficient - generating with AI","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1236,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1236:12)"},"databaseResults":0,"needed":15,"suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.411Z","level":"info","service":"AIProcessor","message":"Overpass suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1300,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1300:18"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.411Z","level":"info","service":"AIProcessor","message":"Mapbox suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1366,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1366:16"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.411Z","level":"info","service":"AIProcessor","message":"OpenAI suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1279,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1279:18"},"count":2,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.411Z","level":"info","service":"AIProcessor","message":"Combined suggestions from sources","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1481,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1481:10)"},"rawCount":2,"afterDedup":2,"withinRadius":2,"sources":["openai","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.413Z","level":"info","service":"AIProcessor","message":"Verifying POIs with tier-based verification","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":488,"column":10,"frame":"at verifyAndScorePoisWithTier (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:488:10)"},"total":2,"unique":2,"withinRadius":2,"verificationPool":2,"limit":60,"radiusKm":10,"sources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.413Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 1","lat":48.8584,"lng":2.2945,"category":"restaurant"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.413Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 1","distanceKm":"0.00","confidence":86,"relevance":89,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.413Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 2","lat":48.859,"lng":2.295,"category":"viewpoint"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.413Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 2","distanceKm":"0.08","confidence":83,"relevance":84,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.859,"lng":2.295}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.414Z","level":"info","service":"AIProcessor","message":"πŸ’Ύ Saving POIs to permanent database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1713,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1713:12)"},"count":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.414Z","level":"info","service":"AIProcessor","message":"Generated POI suggestions with tier-based strategy","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1772,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1772:10)"},"poisCount":2,"processingTimeMs":4,"tier":"premium","suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts > POI Processor - Enhanced Context > Multi-source Verification > should filter out low-confidence POIs (< 40%) @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.414Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10,"tier":"premium","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.414Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":0,"timeMs":0,"categories":["restaurant","viewpoint"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.414Z","level":"info","service":"AIProcessor","message":"Database insufficient - generating with AI","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1236,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1236:12)"},"databaseResults":0,"needed":15,"suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.414Z","level":"info","service":"AIProcessor","message":"Overpass suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1300,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1300:18"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.414Z","level":"info","service":"AIProcessor","message":"Mapbox suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1366,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1366:16"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.414Z","level":"info","service":"AIProcessor","message":"OpenAI suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1279,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1279:18"},"count":2,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.414Z","level":"info","service":"AIProcessor","message":"Combined suggestions from sources","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1481,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1481:10)"},"rawCount":2,"afterDedup":2,"withinRadius":2,"sources":["openai","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.414Z","level":"info","service":"AIProcessor","message":"Verifying POIs with tier-based verification","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":488,"column":10,"frame":"at verifyAndScorePoisWithTier (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:488:10)"},"total":2,"unique":2,"withinRadius":2,"verificationPool":2,"limit":60,"radiusKm":10,"sources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.414Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 1","lat":48.8584,"lng":2.2945,"category":"restaurant"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.415Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 1","distanceKm":"0.00","confidence":86,"relevance":89,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.415Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 2","lat":48.859,"lng":2.295,"category":"viewpoint"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.415Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 2","distanceKm":"0.08","confidence":83,"relevance":84,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.859,"lng":2.295}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.415Z","level":"info","service":"AIProcessor","message":"πŸ’Ύ Saving POIs to permanent database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1713,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1713:12)"},"count":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.415Z","level":"info","service":"AIProcessor","message":"Generated POI suggestions with tier-based strategy","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1772,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1772:10)"},"poisCount":2,"processingTimeMs":1,"tier":"premium","suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts > POI Processor - Enhanced Context > Distance Enforcement > should reject POIs beyond radius @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.416Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":5,"tier":"premium","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.416Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":0,"timeMs":0,"categories":["restaurant","viewpoint"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.416Z","level":"info","service":"AIProcessor","message":"Database insufficient - generating with AI","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1236,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1236:12)"},"databaseResults":0,"needed":15,"suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.416Z","level":"info","service":"AIProcessor","message":"Overpass suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1300,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1300:18"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.416Z","level":"info","service":"AIProcessor","message":"Mapbox suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1366,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1366:16"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.416Z","level":"info","service":"AIProcessor","message":"OpenAI suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1279,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1279:18"},"count":2,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.416Z","level":"info","service":"AIProcessor","message":"Combined suggestions from sources","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1481,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1481:10)"},"rawCount":2,"afterDedup":2,"withinRadius":2,"sources":["openai","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.416Z","level":"info","service":"AIProcessor","message":"Verifying POIs with tier-based verification","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":488,"column":10,"frame":"at verifyAndScorePoisWithTier (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:488:10)"},"total":2,"unique":2,"withinRadius":2,"verificationPool":2,"limit":60,"radiusKm":5,"sources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.416Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 1","lat":48.8584,"lng":2.2945,"category":"restaurant"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.416Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 1","distanceKm":"0.00","confidence":86,"relevance":89,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.416Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 2","lat":48.859,"lng":2.295,"category":"viewpoint"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.416Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 2","distanceKm":"0.08","confidence":83,"relevance":84,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.859,"lng":2.295}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.417Z","level":"info","service":"AIProcessor","message":"πŸ’Ύ Saving POIs to permanent database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1713,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1713:12)"},"count":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.417Z","level":"info","service":"AIProcessor","message":"Generated POI suggestions with tier-based strategy","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1772,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1772:10)"},"poisCount":2,"processingTimeMs":1,"tier":"premium","suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts > POI Processor - Enhanced Context > Distance Enforcement > should NOT add buffer distance @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.417Z","level":"warn","service":"AIProcessor","message":"POI suggestion payload failed validation","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1087,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1087:12)"},"issues":["[object]"]} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts > POI Processor - Enhanced Context > Caching > should check cache before processing @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.418Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"cacheKey":"test-cache-key","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10,"tier":"premium","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.418Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":0,"timeMs":0,"categories":["restaurant","viewpoint"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.418Z","level":"info","service":"AIProcessor","message":"Database insufficient - generating with AI","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1236,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1236:12)"},"databaseResults":0,"needed":15,"suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.418Z","level":"info","service":"AIProcessor","message":"Overpass suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1300,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1300:18"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.418Z","level":"info","service":"AIProcessor","message":"Mapbox suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1366,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1366:16"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.418Z","level":"info","service":"AIProcessor","message":"OpenAI suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1279,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1279:18"},"count":2,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.418Z","level":"info","service":"AIProcessor","message":"Combined suggestions from sources","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1481,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1481:10)"},"rawCount":2,"afterDedup":2,"withinRadius":2,"sources":["openai","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.418Z","level":"info","service":"AIProcessor","message":"Verifying POIs with tier-based verification","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":488,"column":10,"frame":"at verifyAndScorePoisWithTier (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:488:10)"},"total":2,"unique":2,"withinRadius":2,"verificationPool":2,"limit":60,"radiusKm":10,"sources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.418Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 1","lat":48.8584,"lng":2.2945,"category":"restaurant"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.418Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 1","distanceKm":"0.00","confidence":86,"relevance":89,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.418Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 2","lat":48.859,"lng":2.295,"category":"viewpoint"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.418Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 2","distanceKm":"0.08","confidence":83,"relevance":84,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.859,"lng":2.295}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.418Z","level":"info","service":"AIProcessor","message":"πŸ’Ύ Saving POIs to permanent database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1713,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1713:12)"},"count":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.418Z","level":"info","service":"AIProcessor","message":"Generated POI suggestions with tier-based strategy","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1772,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1772:10)"},"poisCount":2,"processingTimeMs":0,"tier":"premium","suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts > POI Processor - Enhanced Context > Caching > should cache results after successful processing @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.419Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"cacheKey":"test-cache-key-2","location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10,"tier":"premium","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.419Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":0,"timeMs":0,"categories":["restaurant","viewpoint"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.419Z","level":"info","service":"AIProcessor","message":"Database insufficient - generating with AI","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1236,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1236:12)"},"databaseResults":0,"needed":15,"suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.419Z","level":"info","service":"AIProcessor","message":"Overpass suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1300,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1300:18"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.419Z","level":"info","service":"AIProcessor","message":"Mapbox suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1366,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1366:16"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.419Z","level":"info","service":"AIProcessor","message":"OpenAI suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1279,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1279:18"},"count":2,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.419Z","level":"info","service":"AIProcessor","message":"Combined suggestions from sources","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1481,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1481:10)"},"rawCount":2,"afterDedup":2,"withinRadius":2,"sources":["openai","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.419Z","level":"info","service":"AIProcessor","message":"Verifying POIs with tier-based verification","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":488,"column":10,"frame":"at verifyAndScorePoisWithTier (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:488:10)"},"total":2,"unique":2,"withinRadius":2,"verificationPool":2,"limit":60,"radiusKm":10,"sources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.420Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 1","lat":48.8584,"lng":2.2945,"category":"restaurant"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.420Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 1","distanceKm":"0.00","confidence":86,"relevance":89,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.420Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 2","lat":48.859,"lng":2.295,"category":"viewpoint"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.420Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 2","distanceKm":"0.08","confidence":83,"relevance":84,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.859,"lng":2.295}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.420Z","level":"info","service":"AIProcessor","message":"πŸ’Ύ Saving POIs to permanent database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1713,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1713:12)"},"count":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.420Z","level":"info","service":"AIProcessor","message":"Generated POI suggestions with tier-based strategy","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1772,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1772:10)"},"poisCount":2,"processingTimeMs":1,"tier":"premium","suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts > POI Processor - Enhanced Context > Enhanced Context Metadata > should include plan and stage metadata @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.420Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10,"tier":"premium","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.420Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":0,"timeMs":0,"categories":["restaurant","viewpoint"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.420Z","level":"info","service":"AIProcessor","message":"Database insufficient - generating with AI","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1236,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1236:12)"},"databaseResults":0,"needed":15,"suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.421Z","level":"info","service":"AIProcessor","message":"Overpass suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1300,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1300:18"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.421Z","level":"info","service":"AIProcessor","message":"Mapbox suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1366,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1366:16"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.421Z","level":"info","service":"AIProcessor","message":"OpenAI suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1279,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1279:18"},"count":2,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.421Z","level":"info","service":"AIProcessor","message":"Combined suggestions from sources","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1481,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1481:10)"},"rawCount":2,"afterDedup":2,"withinRadius":2,"sources":["openai","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.421Z","level":"info","service":"AIProcessor","message":"Verifying POIs with tier-based verification","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":488,"column":10,"frame":"at verifyAndScorePoisWithTier (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:488:10)"},"total":2,"unique":2,"withinRadius":2,"verificationPool":2,"limit":60,"radiusKm":10,"sources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.421Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 1","lat":48.8584,"lng":2.2945,"category":"restaurant"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.421Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 1","distanceKm":"0.00","confidence":86,"relevance":89,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.421Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 2","lat":48.859,"lng":2.295,"category":"viewpoint"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.421Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 2","distanceKm":"0.08","confidence":83,"relevance":84,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.859,"lng":2.295}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.421Z","level":"info","service":"AIProcessor","message":"πŸ’Ύ Saving POIs to permanent database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1713,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1713:12)"},"count":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.421Z","level":"info","service":"AIProcessor","message":"Generated POI suggestions with tier-based strategy","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1772,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1772:10)"},"poisCount":2,"processingTimeMs":1,"tier":"premium","suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"],"planId":"plan-123","stageId":"stage-456"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts > POI Processor - Enhanced Context > Enhanced Context Metadata > should track processing time @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.422Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10,"tier":"premium","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.422Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":0,"timeMs":0,"categories":["restaurant","viewpoint"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.422Z","level":"info","service":"AIProcessor","message":"Database insufficient - generating with AI","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1236,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1236:12)"},"databaseResults":0,"needed":15,"suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.422Z","level":"info","service":"AIProcessor","message":"Overpass suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1300,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1300:18"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.422Z","level":"info","service":"AIProcessor","message":"Mapbox suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1366,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1366:16"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.422Z","level":"info","service":"AIProcessor","message":"OpenAI suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1279,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1279:18"},"count":2,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.422Z","level":"info","service":"AIProcessor","message":"Combined suggestions from sources","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1481,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1481:10)"},"rawCount":2,"afterDedup":2,"withinRadius":2,"sources":["openai","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.422Z","level":"info","service":"AIProcessor","message":"Verifying POIs with tier-based verification","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":488,"column":10,"frame":"at verifyAndScorePoisWithTier (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:488:10)"},"total":2,"unique":2,"withinRadius":2,"verificationPool":2,"limit":60,"radiusKm":10,"sources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.422Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 1","lat":48.8584,"lng":2.2945,"category":"restaurant"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.422Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 1","distanceKm":"0.00","confidence":86,"relevance":89,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.422Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 2","lat":48.859,"lng":2.295,"category":"viewpoint"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.422Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 2","distanceKm":"0.08","confidence":83,"relevance":84,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.859,"lng":2.295}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.422Z","level":"info","service":"AIProcessor","message":"πŸ’Ύ Saving POIs to permanent database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1713,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1713:12)"},"count":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.422Z","level":"info","service":"AIProcessor","message":"Generated POI suggestions with tier-based strategy","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1772,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1772:10)"},"poisCount":2,"processingTimeMs":0,"tier":"premium","suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts > POI Processor - Enhanced Context > Enhanced Context Metadata > should track verification count @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.422Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10,"tier":"premium","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.423Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":0,"timeMs":0,"categories":["restaurant","viewpoint"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.423Z","level":"info","service":"AIProcessor","message":"Database insufficient - generating with AI","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1236,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1236:12)"},"databaseResults":0,"needed":15,"suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.423Z","level":"info","service":"AIProcessor","message":"Overpass suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1300,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1300:18"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.423Z","level":"info","service":"AIProcessor","message":"Mapbox suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1366,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1366:16"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.423Z","level":"info","service":"AIProcessor","message":"OpenAI suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1279,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1279:18"},"count":2,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.423Z","level":"info","service":"AIProcessor","message":"Combined suggestions from sources","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1481,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1481:10)"},"rawCount":2,"afterDedup":2,"withinRadius":2,"sources":["openai","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.423Z","level":"info","service":"AIProcessor","message":"Verifying POIs with tier-based verification","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":488,"column":10,"frame":"at verifyAndScorePoisWithTier (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:488:10)"},"total":2,"unique":2,"withinRadius":2,"verificationPool":2,"limit":60,"radiusKm":10,"sources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.423Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 1","lat":48.8584,"lng":2.2945,"category":"restaurant"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.423Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 1","distanceKm":"0.00","confidence":86,"relevance":89,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.423Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 2","lat":48.859,"lng":2.295,"category":"viewpoint"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.423Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 2","distanceKm":"0.08","confidence":83,"relevance":84,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.859,"lng":2.295}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.423Z","level":"info","service":"AIProcessor","message":"πŸ’Ύ Saving POIs to permanent database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1713,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1713:12)"},"count":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.423Z","level":"info","service":"AIProcessor","message":"Generated POI suggestions with tier-based strategy","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1772,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1772:10)"},"poisCount":2,"processingTimeMs":1,"tier":"premium","suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts > POI Processor - Enhanced Context > Relevance Scoring > should calculate relevance based on multiple factors @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.423Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10,"tier":"premium","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.425Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":0,"timeMs":0,"categories":["restaurant","viewpoint"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.425Z","level":"info","service":"AIProcessor","message":"Database insufficient - generating with AI","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1236,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1236:12)"},"databaseResults":0,"needed":15,"suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.426Z","level":"info","service":"AIProcessor","message":"Overpass suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1300,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1300:18"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.426Z","level":"info","service":"AIProcessor","message":"Mapbox suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1366,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1366:16"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.426Z","level":"info","service":"AIProcessor","message":"OpenAI suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1279,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1279:18"},"count":2,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.426Z","level":"info","service":"AIProcessor","message":"Combined suggestions from sources","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1481,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1481:10)"},"rawCount":2,"afterDedup":2,"withinRadius":2,"sources":["openai","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.426Z","level":"info","service":"AIProcessor","message":"Verifying POIs with tier-based verification","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":488,"column":10,"frame":"at verifyAndScorePoisWithTier (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:488:10)"},"total":2,"unique":2,"withinRadius":2,"verificationPool":2,"limit":60,"radiusKm":10,"sources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.426Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 1","lat":48.8584,"lng":2.2945,"category":"restaurant"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.426Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 1","distanceKm":"0.00","confidence":86,"relevance":89,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.426Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 2","lat":48.859,"lng":2.295,"category":"viewpoint"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.426Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 2","distanceKm":"0.08","confidence":83,"relevance":84,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.859,"lng":2.295}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.426Z","level":"info","service":"AIProcessor","message":"πŸ’Ύ Saving POIs to permanent database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1713,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1713:12)"},"count":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.426Z","level":"info","service":"AIProcessor","message":"Generated POI suggestions with tier-based strategy","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1772,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1772:10)"},"poisCount":2,"processingTimeMs":3,"tier":"premium","suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts > POI Processor - Enhanced Context > Relevance Scoring > should sort by relevance first @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.426Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10,"tier":"premium","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.426Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":0,"timeMs":0,"categories":["restaurant","viewpoint"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"info","service":"AIProcessor","message":"Database insufficient - generating with AI","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1236,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1236:12)"},"databaseResults":0,"needed":15,"suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"info","service":"AIProcessor","message":"Overpass suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1300,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1300:18"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"info","service":"AIProcessor","message":"Mapbox suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1366,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1366:16"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"info","service":"AIProcessor","message":"OpenAI suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1279,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1279:18"},"count":2,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"info","service":"AIProcessor","message":"Combined suggestions from sources","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1481,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1481:10)"},"rawCount":2,"afterDedup":2,"withinRadius":2,"sources":["openai","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"info","service":"AIProcessor","message":"Verifying POIs with tier-based verification","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":488,"column":10,"frame":"at verifyAndScorePoisWithTier (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:488:10)"},"total":2,"unique":2,"withinRadius":2,"verificationPool":2,"limit":60,"radiusKm":10,"sources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 1","lat":48.8584,"lng":2.2945,"category":"restaurant"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 1","distanceKm":"0.00","confidence":86,"relevance":89,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 2","lat":48.859,"lng":2.295,"category":"viewpoint"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 2","distanceKm":"0.08","confidence":83,"relevance":84,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.859,"lng":2.295}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"info","service":"AIProcessor","message":"πŸ’Ύ Saving POIs to permanent database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1713,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1713:12)"},"count":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"info","service":"AIProcessor","message":"Generated POI suggestions with tier-based strategy","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1772,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1772:10)"},"poisCount":2,"processingTimeMs":1,"tier":"premium","suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts > POI Processor - Enhanced Context > Error Handling > should fall back to Mapbox when OpenAI fails @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10,"tier":"premium","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":0,"timeMs":0,"categories":["restaurant","viewpoint"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"info","service":"AIProcessor","message":"Database insufficient - generating with AI","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1236,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1236:12)"},"databaseResults":0,"needed":15,"suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"info","service":"AIProcessor","message":"Overpass suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1300,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1300:18"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"info","service":"AIProcessor","message":"Mapbox suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1366,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1366:16"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.427Z","level":"info","service":"AIProcessor","message":"OpenAI suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1279,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1279:18"},"count":2,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"info","service":"AIProcessor","message":"Combined suggestions from sources","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1481,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1481:10)"},"rawCount":2,"afterDedup":2,"withinRadius":2,"sources":["openai","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"info","service":"AIProcessor","message":"Verifying POIs with tier-based verification","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":488,"column":10,"frame":"at verifyAndScorePoisWithTier (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:488:10)"},"total":2,"unique":2,"withinRadius":2,"verificationPool":2,"limit":60,"radiusKm":10,"sources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 1","lat":48.8584,"lng":2.2945,"category":"restaurant"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 1","distanceKm":"0.00","confidence":86,"relevance":89,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 2","lat":48.859,"lng":2.295,"category":"viewpoint"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 2","distanceKm":"0.08","confidence":83,"relevance":84,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.859,"lng":2.295}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"info","service":"AIProcessor","message":"πŸ’Ύ Saving POIs to permanent database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1713,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1713:12)"},"count":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"info","service":"AIProcessor","message":"Generated POI suggestions with tier-based strategy","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1772,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1772:10)"},"poisCount":2,"processingTimeMs":1,"tier":"premium","suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/ai/__tests__/poi.processor.test.ts (14 tests) 27ms @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/poi.processor.test.ts > POI Processor - Enhanced Context > Error Handling > should return database fallback when all services fail @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"info","service":"AIProcessor","message":"Cache MISS - checking POI database first","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1144,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1144:10)"},"location":{"lat":48.8584,"lng":2.2945},"categories":["restaurant","viewpoint"],"radiusKm":10,"tier":"premium","databaseEnabled":true,"minDatabaseResults":15,"minDatabaseConfidence":60} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"info","service":"AIProcessor","message":"POI database search complete","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1190,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1190:12)"},"found":0,"timeMs":0,"categories":["restaurant","viewpoint"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"info","service":"AIProcessor","message":"Database insufficient - generating with AI","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1236,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1236:12)"},"databaseResults":0,"needed":15,"suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"info","service":"AIProcessor","message":"Overpass suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1300,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1300:18"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"info","service":"AIProcessor","message":"Mapbox suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1366,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1366:16"},"count":0,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"info","service":"AIProcessor","message":"OpenAI suggestions retrieved","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1279,"column":18,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1279:18"},"count":2,"timeMs":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"info","service":"AIProcessor","message":"Combined suggestions from sources","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1481,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1481:10)"},"rawCount":2,"afterDedup":2,"withinRadius":2,"sources":["openai","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"info","service":"AIProcessor","message":"Verifying POIs with tier-based verification","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":488,"column":10,"frame":"at verifyAndScorePoisWithTier (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:488:10)"},"total":2,"unique":2,"withinRadius":2,"verificationPool":2,"limit":60,"radiusKm":10,"sources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.428Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 1","lat":48.8584,"lng":2.2945,"category":"restaurant"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.429Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 1","distanceKm":"0.00","confidence":86,"relevance":89,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.429Z","level":"debug","service":"AIProcessor","message":"Valid POI coordinates","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":671,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:671:14"},"name":"Test POI 2","lat":48.859,"lng":2.295,"category":"viewpoint"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.429Z","level":"debug","service":"AIProcessor","message":"POI verified with tier sources","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":678,"column":14,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:678:14"},"name":"Test POI 2","distanceKm":"0.08","confidence":83,"relevance":84,"matchCount":2,"sources":["google","mapbox","overpass"],"googleMatched":true,"overpassMatched":false,"mapboxMatched":true,"coordinates":{"lat":48.859,"lng":2.295}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.429Z","level":"info","service":"AIProcessor","message":"πŸ’Ύ Saving POIs to permanent database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1713,"column":12,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1713:12)"},"count":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.429Z","level":"info","service":"AIProcessor","message":"Generated POI suggestions with tier-based strategy","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts","line":1772,"column":10,"frame":"at Module.processPoiSuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/poi.processor.ts:1772:10)"},"poisCount":2,"processingTimeMs":1,"tier":"premium","suggestionSources":["openai","mapbox","overpass"],"verificationSources":["google","mapbox","overpass"]} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.routes.integration.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (35) from .env -- tip: βš™οΈ specify custom .env file path with { path: '/custom/path/.env' } @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.431Z","level":"info","service":"redis-config","message":"Forcing Upstash Redis (REDIS_DRIVER=upstash)","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts","line":51,"column":12,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts:51:12"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/google-places.service.test.ts > GooglePlacesService > verifyPlace > should return no match when place not found @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.441Z","level":"debug","service":"GooglePlacesService","message":"Processing batch of 1 verifications","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts","line":108,"column":12,"frame":"at GooglePlacesService.processBatch (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts:108:12)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.442Z","level":"debug","service":"GooglePlacesService","message":"No Google Places results found","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts","line":173,"column":16,"frame":"at GooglePlacesService.verifyPlaceImmediate (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts:173:16)"},"query":"Nonexistent Place","target":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.routes.integration.test.ts @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.445Z","level":"info","service":"redis","message":"Using Upstash Redis client","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts","line":36,"column":12,"frame":"at new UpstashRedisAdapter (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts:36:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/gamification/__tests__/progress-updates.test.ts > Gamification progress updates > marks a challenge as completed in the same progress update @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.491Z","level":"info","service":"ChallengeService","message":"Challenge progress updated","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/gamification/challenge.service.ts","line":236,"column":21,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/gamification/challenge.service.ts:236:21"},"challengeId":"challenge-1","userId":"user-1","newValue":5,"targetValue":5,"completed":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.494Z","level":"debug","service":"ChallengeService","message":"updateChallengeProgress completed","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/gamification/challenge.service.ts","line":175,"column":12,"frame":"at ChallengeService.updateChallengeProgress (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/gamification/challenge.service.ts:175:12)"},"duration":3,"operation":"updateChallengeProgress"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/gamification/__tests__/progress-updates.test.ts (2 tests) 7ms @my-roadtrip/api:test:unit: stdout | src/modules/gamification/__tests__/progress-updates.test.ts > Gamification progress updates > marks a quest as completed in the same progress update @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.495Z","level":"info","service":"QuestService","message":"Quest completed","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/gamification/quest.service.ts","line":365,"column":21,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/gamification/quest.service.ts:365:21"},"questId":"quest-1","userId":"user-1","reward":{"points":50}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.496Z","level":"debug","service":"QuestService","message":"completeQuest completed","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/gamification/quest.service.ts","line":328,"column":12,"frame":"at QuestService.completeQuest (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/gamification/quest.service.ts:328:12)"},"duration":1,"operation":"completeQuest"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.496Z","level":"info","service":"QuestService","message":"Quest progress updated","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/gamification/quest.service.ts","line":251,"column":21,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/gamification/quest.service.ts:251:21"},"questId":"quest-1","userId":"user-1","newValue":3,"targetValue":3,"completed":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.496Z","level":"debug","service":"QuestService","message":"updateQuestProgress completed","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/gamification/quest.service.ts","line":211,"column":12,"frame":"at QuestService.updateQuestProgress (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/gamification/quest.service.ts:211:12)"},"duration":1,"operation":"updateQuestProgress"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.integration.test.ts > Planner Module Integration Tests > GET /api/planner/plans > should return empty array for new user @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.516Z","level":"debug","service":"PlannerController","message":"Request: Get user plans","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":175,"column":12,"frame":"at PlannerController.getPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:175:12)"},"userId":"new-user"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.517Z","level":"debug","service":"PlannerService","message":"Fetching user plans","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":99,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:99:12)"},"userId":"new-user","cacheEnabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.518Z","level":"debug","service":"PlannerService","message":"Cache miss for user plans","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":110,"column":14,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:110:14)"},"userId":"new-user"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.518Z","level":"info","service":"PlannerService","message":"Fetching user plans from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":114,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:114:12)"},"userId":"new-user"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.518Z","level":"info","service":"PlannerService","message":"User plans fetched","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":116,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:116:12)"},"userId":"new-user","count":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.518Z","level":"debug","service":"PlannerService","message":"User plans cached","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":122,"column":14,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:122:14)"},"userId":"new-user","ttl":300} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.518Z","level":"info","service":"PlannerController","message":"User plans fetched successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":184,"column":14,"frame":"at PlannerController.getPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:184:14)"},"userId":"new-user","count":0} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.integration.test.ts > Planner Module Integration Tests > POST /api/planner/plans > should create a new plan @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.522Z","level":"debug","service":"PlannerController","message":"Request: Create plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":243,"column":12,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:243:12)"},"userId":"test-user-1","planName":"Test Road Trip"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.522Z","level":"debug","service":"PlannerService","message":"Fetching user plans","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":99,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:99:12)"},"userId":"test-user-1","cacheEnabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.522Z","level":"debug","service":"PlannerService","message":"Cache miss for user plans","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":110,"column":14,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:110:14)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.522Z","level":"info","service":"PlannerService","message":"Fetching user plans from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":114,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:114:12)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.522Z","level":"info","service":"PlannerService","message":"User plans fetched","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":116,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:116:12)"},"userId":"test-user-1","count":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.522Z","level":"debug","service":"PlannerService","message":"User plans cached","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":122,"column":14,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:122:14)"},"userId":"test-user-1","ttl":300} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.522Z","level":"debug","service":"PlannerController","message":"Checking plan limit","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":255,"column":14,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:255:14)"},"userId":"test-user-1","currentPlans":0,"maxPlans":100} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.523Z","level":"info","service":"PlannerService","message":"Creating plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":398,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:398:12)"},"userId":"test-user-1","planName":"Test Road Trip"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.523Z","level":"debug","service":"PlannerService","message":"Plan creation details","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":399,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:399:12)"},"dto":{"name":"Test Road Trip","description":"A test trip across Europe","isPublic":false},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.523Z","level":"info","service":"PlannerService","message":"Plan created successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":402,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:402:12)"},"planId":"plan-1","userId":"test-user-1","planName":"Test Road Trip"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.523Z","level":"debug","service":"PlannerService","message":"Initializing CRDT for plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":411,"column":14,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:411:14)"},"planId":"plan-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.525Z","level":"debug","service":"PlannerService","message":"CRDT initialized","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":413,"column":14,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:413:14)"},"planId":"plan-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.525Z","level":"debug","service":"PlannerService","message":"Invalidating cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":51,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:51:12)"},"keys":["plan:user:test-user-1"],"enabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.525Z","level":"debug","service":"PlannerService","message":"Cache invalidated successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":53,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:53:12)"},"keysCount":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.525Z","level":"debug","service":"PlannerService","message":"Invalidating dashboard cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":62,"column":12,"frame":"at PlannerService.invalidateDashboardCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:62:12)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.525Z","level":"info","service":"PlannerController","message":"Plan created via controller","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":291,"column":14,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:291:14)"},"userId":"test-user-1","planId":"plan-1","stagesCount":0,"durationMs":3,"billing":"free"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.integration.test.ts > Planner Module Integration Tests > GET /api/planner/plans/:id > should return plan by ID @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.529Z","level":"debug","service":"PlannerController","message":"Request: Create plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":243,"column":12,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:243:12)"},"userId":"test-user-1","planName":"Test Plan"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.529Z","level":"debug","service":"PlannerService","message":"Fetching user plans","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":99,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:99:12)"},"userId":"test-user-1","cacheEnabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.530Z","level":"debug","service":"PlannerService","message":"Cache miss for user plans","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":110,"column":14,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:110:14)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.530Z","level":"info","service":"PlannerService","message":"Fetching user plans from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":114,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:114:12)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.530Z","level":"info","service":"PlannerService","message":"User plans fetched","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":116,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:116:12)"},"userId":"test-user-1","count":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.530Z","level":"debug","service":"PlannerService","message":"User plans cached","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":122,"column":14,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:122:14)"},"userId":"test-user-1","ttl":300} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.530Z","level":"debug","service":"PlannerController","message":"Checking plan limit","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":255,"column":14,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:255:14)"},"userId":"test-user-1","currentPlans":1,"maxPlans":100} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.530Z","level":"info","service":"PlannerService","message":"Creating plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":398,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:398:12)"},"userId":"test-user-1","planName":"Test Plan"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.530Z","level":"debug","service":"PlannerService","message":"Plan creation details","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":399,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:399:12)"},"dto":{"name":"Test Plan","isPublic":false},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.531Z","level":"info","service":"PlannerService","message":"Plan created successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":402,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:402:12)"},"planId":"plan-2","userId":"test-user-1","planName":"Test Plan"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.531Z","level":"debug","service":"PlannerService","message":"Initializing CRDT for plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":411,"column":14,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:411:14)"},"planId":"plan-2"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.532Z","level":"debug","service":"PlannerService","message":"CRDT initialized","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":413,"column":14,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:413:14)"},"planId":"plan-2"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.532Z","level":"debug","service":"PlannerService","message":"Invalidating cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":51,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:51:12)"},"keys":["plan:user:test-user-1"],"enabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.532Z","level":"debug","service":"PlannerService","message":"Cache invalidated successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":53,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:53:12)"},"keysCount":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.532Z","level":"debug","service":"PlannerService","message":"Invalidating dashboard cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":62,"column":12,"frame":"at PlannerService.invalidateDashboardCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:62:12)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.532Z","level":"info","service":"PlannerController","message":"Plan created via controller","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":291,"column":14,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:291:14)"},"userId":"test-user-1","planId":"plan-2","stagesCount":0,"durationMs":3,"billing":"free"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.533Z","level":"debug","service":"PlannerController","message":"Request: Get plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":216,"column":12,"frame":"at PlannerController.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:216:12)"},"planId":"plan-2","userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.533Z","level":"debug","service":"PlannerService","message":"Fetching plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":363,"column":12,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:363:12)"},"planId":"plan-2","cacheEnabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.533Z","level":"debug","service":"PlannerService","message":"Cache miss for plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":374,"column":14,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:374:14)"},"planId":"plan-2"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.533Z","level":"info","service":"PlannerService","message":"Fetching plan from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":378,"column":12,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:378:12)"},"planId":"plan-2"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.533Z","level":"info","service":"PlannerService","message":"Plan found","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":382,"column":14,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:382:14)"},"planId":"plan-2","stagesCount":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.533Z","level":"debug","service":"PlannerService","message":"Plan cached","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":388,"column":16,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:388:16)"},"planId":"plan-2","ttl":300} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.533Z","level":"info","service":"PlannerController","message":"Plan fetched successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":232,"column":14,"frame":"at PlannerController.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:232:14)"},"planId":"plan-2","userId":"test-user-1","stagesCount":0} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.integration.test.ts > Planner Module Integration Tests > GET /api/planner/plans/:id > should return 404 for non-existent plan @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.536Z","level":"debug","service":"PlannerController","message":"Request: Get plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":216,"column":12,"frame":"at PlannerController.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:216:12)"},"planId":"non-existent-id","userId":"test-token"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.536Z","level":"debug","service":"PlannerService","message":"Fetching plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":363,"column":12,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:363:12)"},"planId":"non-existent-id","cacheEnabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.537Z","level":"debug","service":"PlannerService","message":"Cache miss for plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":374,"column":14,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:374:14)"},"planId":"non-existent-id"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.537Z","level":"info","service":"PlannerService","message":"Fetching plan from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":378,"column":12,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:378:12)"},"planId":"non-existent-id"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.537Z","level":"warn","service":"PlannerService","message":"Plan not found","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":391,"column":14,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:391:14)"},"planId":"non-existent-id"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.537Z","level":"warn","service":"PlannerController","message":"Plan not found","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":222,"column":16,"frame":"at PlannerController.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:222:16)"},"planId":"non-existent-id","userId":"test-token"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.integration.test.ts > Planner Module Integration Tests > GET /api/planner/plans/:id > should deny access to other user's plan @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.540Z","level":"debug","service":"PlannerController","message":"Request: Create plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":243,"column":12,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:243:12)"},"userId":"user-1","planName":"User 1 Plan"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.540Z","level":"debug","service":"PlannerService","message":"Fetching user plans","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":99,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:99:12)"},"userId":"user-1","cacheEnabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.540Z","level":"debug","service":"PlannerService","message":"Cache miss for user plans","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":110,"column":14,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:110:14)"},"userId":"user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.540Z","level":"info","service":"PlannerService","message":"Fetching user plans from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":114,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:114:12)"},"userId":"user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.540Z","level":"info","service":"PlannerService","message":"User plans fetched","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":116,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:116:12)"},"userId":"user-1","count":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.540Z","level":"debug","service":"PlannerService","message":"User plans cached","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":122,"column":14,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:122:14)"},"userId":"user-1","ttl":300} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.540Z","level":"debug","service":"PlannerController","message":"Checking plan limit","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":255,"column":14,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:255:14)"},"userId":"user-1","currentPlans":0,"maxPlans":100} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.540Z","level":"info","service":"PlannerService","message":"Creating plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":398,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:398:12)"},"userId":"user-1","planName":"User 1 Plan"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.540Z","level":"debug","service":"PlannerService","message":"Plan creation details","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":399,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:399:12)"},"dto":{"name":"User 1 Plan","isPublic":false},"userId":"user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.540Z","level":"info","service":"PlannerService","message":"Plan created successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":402,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:402:12)"},"planId":"plan-3","userId":"user-1","planName":"User 1 Plan"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.541Z","level":"debug","service":"PlannerService","message":"Initializing CRDT for plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":411,"column":14,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:411:14)"},"planId":"plan-3"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.541Z","level":"debug","service":"PlannerService","message":"CRDT initialized","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":413,"column":14,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:413:14)"},"planId":"plan-3"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.541Z","level":"debug","service":"PlannerService","message":"Invalidating cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":51,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:51:12)"},"keys":["plan:user:user-1"],"enabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.541Z","level":"debug","service":"PlannerService","message":"Cache invalidated successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":53,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:53:12)"},"keysCount":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.541Z","level":"debug","service":"PlannerService","message":"Invalidating dashboard cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":62,"column":12,"frame":"at PlannerService.invalidateDashboardCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:62:12)"},"userId":"user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.541Z","level":"info","service":"PlannerController","message":"Plan created via controller","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":291,"column":14,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:291:14)"},"userId":"user-1","planId":"plan-3","stagesCount":0,"durationMs":1,"billing":"free"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.541Z","level":"debug","service":"PlannerController","message":"Request: Get plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":216,"column":12,"frame":"at PlannerController.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:216:12)"},"planId":"plan-3","userId":"user-2"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.541Z","level":"debug","service":"PlannerService","message":"Fetching plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":363,"column":12,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:363:12)"},"planId":"plan-3","cacheEnabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.542Z","level":"debug","service":"PlannerService","message":"Cache miss for plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":374,"column":14,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:374:14)"},"planId":"plan-3"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.542Z","level":"info","service":"PlannerService","message":"Fetching plan from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":378,"column":12,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:378:12)"},"planId":"plan-3"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.542Z","level":"info","service":"PlannerService","message":"Plan found","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":382,"column":14,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:382:14)"},"planId":"plan-3","stagesCount":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.542Z","level":"debug","service":"PlannerService","message":"Plan cached","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":388,"column":16,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:388:16)"},"planId":"plan-3","ttl":300} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.542Z","level":"warn","service":"PlannerController","message":"Forbidden: User does not have access to plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":228,"column":16,"frame":"at PlannerController.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:228:16)"},"planId":"plan-3","userId":"user-2","ownerId":"user-1"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/google-places.service.test.ts > GooglePlacesService > verifyPlace > should handle API errors gracefully @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.548Z","level":"debug","service":"GooglePlacesService","message":"Processing batch of 1 verifications","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts","line":108,"column":12,"frame":"at GooglePlacesService.processBatch (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts:108:12)"}} @my-roadtrip/api:test:unit: stderr | src/services/__tests__/google-places.service.test.ts > GooglePlacesService > verifyPlace > should handle API errors gracefully @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.548Z","level":"error","service":"GooglePlacesService","message":"Google Places verification error","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts","line":229,"column":14,"frame":"at GooglePlacesService.verifyPlaceImmediate (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts:229:14)"},"error":{"name":"Error","message":"Network error","stack":"Error: Network error\n at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/__tests__/google-places.service.test.ts:79:56\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:533:11\n at runWithTimeout (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:39:7)\n at runTest (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:1056:17)"},"query":"Test Place","target":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.integration.test.ts > Planner Module Integration Tests > PATCH /api/planner/plans/:id > should update plan @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.543Z","level":"debug","service":"PlannerController","message":"Request: Create plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":243,"column":12,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:243:12)"},"userId":"test-user-1","planName":"Original Title"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.544Z","level":"debug","service":"PlannerService","message":"Fetching user plans","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":99,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:99:12)"},"userId":"test-user-1","cacheEnabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.544Z","level":"debug","service":"PlannerService","message":"Cache miss for user plans","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":110,"column":14,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:110:14)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.544Z","level":"info","service":"PlannerService","message":"Fetching user plans from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":114,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:114:12)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.544Z","level":"info","service":"PlannerService","message":"User plans fetched","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":116,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:116:12)"},"userId":"test-user-1","count":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.544Z","level":"debug","service":"PlannerService","message":"User plans cached","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":122,"column":14,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:122:14)"},"userId":"test-user-1","ttl":300} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.544Z","level":"debug","service":"PlannerController","message":"Checking plan limit","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":255,"column":14,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:255:14)"},"userId":"test-user-1","currentPlans":2,"maxPlans":100} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.544Z","level":"info","service":"PlannerService","message":"Creating plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":398,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:398:12)"},"userId":"test-user-1","planName":"Original Title"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.544Z","level":"debug","service":"PlannerService","message":"Plan creation details","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":399,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:399:12)"},"dto":{"name":"Original Title","isPublic":false},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.544Z","level":"info","service":"PlannerService","message":"Plan created successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":402,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:402:12)"},"planId":"plan-4","userId":"test-user-1","planName":"Original Title"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.544Z","level":"debug","service":"PlannerService","message":"Initializing CRDT for plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":411,"column":14,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:411:14)"},"planId":"plan-4"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.544Z","level":"debug","service":"PlannerService","message":"CRDT initialized","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":413,"column":14,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:413:14)"},"planId":"plan-4"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.544Z","level":"debug","service":"PlannerService","message":"Invalidating cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":51,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:51:12)"},"keys":["plan:user:test-user-1"],"enabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.544Z","level":"debug","service":"PlannerService","message":"Cache invalidated successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":53,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:53:12)"},"keysCount":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.545Z","level":"debug","service":"PlannerService","message":"Invalidating dashboard cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":62,"column":12,"frame":"at PlannerService.invalidateDashboardCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:62:12)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.545Z","level":"info","service":"PlannerController","message":"Plan created via controller","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":291,"column":14,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:291:14)"},"userId":"test-user-1","planId":"plan-4","stagesCount":0,"durationMs":1,"billing":"free"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.546Z","level":"debug","service":"PlannerController","message":"Request: Update plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":355,"column":14,"frame":"at PlannerController.updatePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:355:14)"},"planId":"plan-4","userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.546Z","level":"debug","service":"PlannerService","message":"Fetching plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":363,"column":12,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:363:12)"},"planId":"plan-4","cacheEnabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.546Z","level":"debug","service":"PlannerService","message":"Cache miss for plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":374,"column":14,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:374:14)"},"planId":"plan-4"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.547Z","level":"info","service":"PlannerService","message":"Fetching plan from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":378,"column":12,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:378:12)"},"planId":"plan-4"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.547Z","level":"info","service":"PlannerService","message":"Plan found","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":382,"column":14,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:382:14)"},"planId":"plan-4","stagesCount":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.547Z","level":"debug","service":"PlannerService","message":"Plan cached","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":388,"column":16,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:388:16)"},"planId":"plan-4","ttl":300} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.547Z","level":"info","service":"PlannerService","message":"Updating plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":424,"column":12,"frame":"at PlannerService.updatePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:424:12)"},"planId":"plan-4","updates":["name","description"]} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.547Z","level":"debug","service":"PlannerService","message":"Plan update details","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":425,"column":12,"frame":"at PlannerService.updatePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:425:12)"},"planId":"plan-4","updates":{"name":"Updated Title","description":"New description"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.547Z","level":"info","service":"PlannerService","message":"Plan updated successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":430,"column":14,"frame":"at PlannerService.updatePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:430:14)"},"planId":"plan-4","userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.547Z","level":"debug","service":"PlannerService","message":"Plan cache updated","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":436,"column":16,"frame":"at PlannerService.updatePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:436:16)"},"planId":"plan-4"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.547Z","level":"debug","service":"PlannerService","message":"Invalidating cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":51,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:51:12)"},"keys":["plan:user:test-user-1"],"enabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.547Z","level":"debug","service":"PlannerService","message":"Cache invalidated successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":53,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:53:12)"},"keysCount":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.547Z","level":"debug","service":"PlannerService","message":"Invalidating dashboard cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":62,"column":12,"frame":"at PlannerService.invalidateDashboardCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:62:12)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.548Z","level":"debug","service":"PlannerService","message":"CRDT version bumped","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":454,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:454:16"},"planId":"plan-4"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.548Z","level":"info","service":"PlannerController","message":"Plan updated via controller","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":371,"column":14,"frame":"at PlannerController.updatePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:371:14)"},"planId":"plan-4","userId":"test-user-1","updatedFields":["name","description"]} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.integration.test.ts > Planner Module Integration Tests > DELETE /api/planner/plans/:id > should delete plan @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.550Z","level":"debug","service":"PlannerController","message":"Request: Create plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":243,"column":12,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:243:12)"},"userId":"test-user-1","planName":"To Delete"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.550Z","level":"debug","service":"PlannerService","message":"Fetching user plans","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":99,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:99:12)"},"userId":"test-user-1","cacheEnabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.550Z","level":"debug","service":"PlannerService","message":"Cache miss for user plans","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":110,"column":14,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:110:14)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.550Z","level":"info","service":"PlannerService","message":"Fetching user plans from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":114,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:114:12)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.550Z","level":"info","service":"PlannerService","message":"User plans fetched","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":116,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:116:12)"},"userId":"test-user-1","count":3} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.550Z","level":"debug","service":"PlannerService","message":"User plans cached","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":122,"column":14,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:122:14)"},"userId":"test-user-1","ttl":300} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.550Z","level":"debug","service":"PlannerController","message":"Checking plan limit","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":255,"column":14,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:255:14)"},"userId":"test-user-1","currentPlans":3,"maxPlans":100} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.550Z","level":"info","service":"PlannerService","message":"Creating plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":398,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:398:12)"},"userId":"test-user-1","planName":"To Delete"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.550Z","level":"debug","service":"PlannerService","message":"Plan creation details","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":399,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:399:12)"},"dto":{"name":"To Delete","isPublic":false},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.550Z","level":"info","service":"PlannerService","message":"Plan created successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":402,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:402:12)"},"planId":"plan-5","userId":"test-user-1","planName":"To Delete"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.551Z","level":"debug","service":"PlannerService","message":"Initializing CRDT for plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":411,"column":14,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:411:14)"},"planId":"plan-5"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.551Z","level":"debug","service":"PlannerService","message":"CRDT initialized","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":413,"column":14,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:413:14)"},"planId":"plan-5"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.551Z","level":"debug","service":"PlannerService","message":"Invalidating cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":51,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:51:12)"},"keys":["plan:user:test-user-1"],"enabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.551Z","level":"debug","service":"PlannerService","message":"Cache invalidated successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":53,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:53:12)"},"keysCount":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.551Z","level":"debug","service":"PlannerService","message":"Invalidating dashboard cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":62,"column":12,"frame":"at PlannerService.invalidateDashboardCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:62:12)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.551Z","level":"info","service":"PlannerController","message":"Plan created via controller","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":291,"column":14,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:291:14)"},"userId":"test-user-1","planId":"plan-5","stagesCount":0,"durationMs":1,"billing":"free"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.551Z","level":"debug","service":"PlannerController","message":"Request: Delete plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":388,"column":14,"frame":"at PlannerController.deletePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:388:14)"},"planId":"plan-5","userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.551Z","level":"debug","service":"PlannerService","message":"Fetching plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":363,"column":12,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:363:12)"},"planId":"plan-5","cacheEnabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.551Z","level":"debug","service":"PlannerService","message":"Cache miss for plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":374,"column":14,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:374:14)"},"planId":"plan-5"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.552Z","level":"info","service":"PlannerService","message":"Fetching plan from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":378,"column":12,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:378:12)"},"planId":"plan-5"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.552Z","level":"info","service":"PlannerService","message":"Plan found","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":382,"column":14,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:382:14)"},"planId":"plan-5","stagesCount":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.552Z","level":"debug","service":"PlannerService","message":"Plan cached","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":388,"column":16,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:388:16)"},"planId":"plan-5","ttl":300} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.552Z","level":"info","service":"PlannerService","message":"Deleting plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":490,"column":12,"frame":"at PlannerService.deletePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:490:12)"},"planId":"plan-5"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.552Z","level":"debug","service":"PlannerService","message":"Plan found for deletion","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":495,"column":14,"frame":"at PlannerService.deletePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:495:14)"},"planId":"plan-5","userId":"test-user-1","stagesCount":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.552Z","level":"info","service":"PlannerService","message":"Plan deleted successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":511,"column":14,"frame":"at PlannerService.deletePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:511:14)"},"planId":"plan-5","userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.552Z","level":"debug","service":"PlannerService","message":"Invalidating cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":51,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:51:12)"},"keys":["plan:plan-5","plan:user:test-user-1"],"enabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.552Z","level":"debug","service":"PlannerService","message":"Cache invalidated successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":53,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:53:12)"},"keysCount":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.552Z","level":"debug","service":"PlannerService","message":"Invalidating dashboard cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":62,"column":12,"frame":"at PlannerService.invalidateDashboardCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:62:12)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.552Z","level":"debug","service":"PlannerService","message":"Deleting CRDT document","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":522,"column":16,"frame":"at PlannerService.deletePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:522:16)"},"planId":"plan-5"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.552Z","level":"debug","service":"PlannerService","message":"CRDT document deleted","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":524,"column":16,"frame":"at PlannerService.deletePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:524:16)"},"planId":"plan-5"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.552Z","level":"info","service":"PlannerController","message":"Plan deleted via controller","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":402,"column":14,"frame":"at PlannerController.deletePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:402:14)"},"planId":"plan-5","userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.553Z","level":"debug","service":"PlannerController","message":"Request: Get plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":216,"column":12,"frame":"at PlannerController.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:216:12)"},"planId":"plan-5","userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.553Z","level":"debug","service":"PlannerService","message":"Fetching plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":363,"column":12,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:363:12)"},"planId":"plan-5","cacheEnabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.553Z","level":"debug","service":"PlannerService","message":"Cache miss for plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":374,"column":14,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:374:14)"},"planId":"plan-5"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.553Z","level":"info","service":"PlannerService","message":"Fetching plan from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":378,"column":12,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:378:12)"},"planId":"plan-5"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.553Z","level":"warn","service":"PlannerService","message":"Plan not found","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":391,"column":14,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:391:14)"},"planId":"plan-5"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.553Z","level":"warn","service":"PlannerController","message":"Plan not found","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":222,"column":16,"frame":"at PlannerController.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:222:16)"},"planId":"plan-5","userId":"test-user-1"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.integration.test.ts > Planner Module Integration Tests > POST /api/planner/plans/:planId/stages > should add stage to plan @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.553Z","level":"debug","service":"PlannerController","message":"Request: Create plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":243,"column":12,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:243:12)"},"userId":"test-user-1","planName":"My Trip"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.554Z","level":"debug","service":"PlannerService","message":"Fetching user plans","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":99,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:99:12)"},"userId":"test-user-1","cacheEnabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.554Z","level":"debug","service":"PlannerService","message":"Cache miss for user plans","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":110,"column":14,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:110:14)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.554Z","level":"info","service":"PlannerService","message":"Fetching user plans from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":114,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:114:12)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.554Z","level":"info","service":"PlannerService","message":"User plans fetched","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":116,"column":12,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:116:12)"},"userId":"test-user-1","count":3} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.554Z","level":"debug","service":"PlannerService","message":"User plans cached","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":122,"column":14,"frame":"at PlannerService.getUserPlans (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:122:14)"},"userId":"test-user-1","ttl":300} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.554Z","level":"debug","service":"PlannerController","message":"Checking plan limit","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":255,"column":14,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:255:14)"},"userId":"test-user-1","currentPlans":3,"maxPlans":100} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.554Z","level":"info","service":"PlannerService","message":"Creating plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":398,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:398:12)"},"userId":"test-user-1","planName":"My Trip"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.554Z","level":"debug","service":"PlannerService","message":"Plan creation details","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":399,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:399:12)"},"dto":{"name":"My Trip","isPublic":false},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.554Z","level":"info","service":"PlannerService","message":"Plan created successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":402,"column":12,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:402:12)"},"planId":"plan-6","userId":"test-user-1","planName":"My Trip"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.554Z","level":"debug","service":"PlannerService","message":"Initializing CRDT for plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":411,"column":14,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:411:14)"},"planId":"plan-6"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.555Z","level":"debug","service":"PlannerService","message":"CRDT initialized","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":413,"column":14,"frame":"at PlannerService.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:413:14)"},"planId":"plan-6"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.555Z","level":"debug","service":"PlannerService","message":"Invalidating cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":51,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:51:12)"},"keys":["plan:user:test-user-1"],"enabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.555Z","level":"debug","service":"PlannerService","message":"Cache invalidated successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":53,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:53:12)"},"keysCount":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.555Z","level":"debug","service":"PlannerService","message":"Invalidating dashboard cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":62,"column":12,"frame":"at PlannerService.invalidateDashboardCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:62:12)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.555Z","level":"info","service":"PlannerController","message":"Plan created via controller","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":291,"column":14,"frame":"at PlannerController.createPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:291:14)"},"userId":"test-user-1","planId":"plan-6","stagesCount":0,"durationMs":1,"billing":"free"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.556Z","level":"debug","service":"PlannerController","message":"Request: Create stage","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":418,"column":14,"frame":"at PlannerController.createStage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:418:14)"},"planId":"plan-6","userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.556Z","level":"debug","service":"PlannerService","message":"Fetching plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":363,"column":12,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:363:12)"},"planId":"plan-6","cacheEnabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.556Z","level":"debug","service":"PlannerService","message":"Cache miss for plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":374,"column":14,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:374:14)"},"planId":"plan-6"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.556Z","level":"info","service":"PlannerService","message":"Fetching plan from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":378,"column":12,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:378:12)"},"planId":"plan-6"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.556Z","level":"info","service":"PlannerService","message":"Plan found","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":382,"column":14,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:382:14)"},"planId":"plan-6","stagesCount":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.556Z","level":"debug","service":"PlannerService","message":"Plan cached","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":388,"column":16,"frame":"at PlannerService.getPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:388:16)"},"planId":"plan-6","ttl":300} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.557Z","level":"info","service":"PlannerService","message":"Creating stage","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":551,"column":12,"frame":"at PlannerService.createStage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:551:12)"},"planId":"plan-6","stageName":"Paris"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.557Z","level":"debug","service":"PlannerService","message":"Stage creation details","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":552,"column":12,"frame":"at PlannerService.createStage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:552:12)"},"planId":"plan-6","dto":{"name":"Paris","location":"[object]","type":"waypoint","order":0}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.557Z","level":"info","service":"PlannerService","message":"Stage created successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":555,"column":12,"frame":"at PlannerService.createStage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:555:12)"},"stageId":"stage-1","planId":"plan-6","stageName":"Paris"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.557Z","level":"debug","service":"PlannerService","message":"Invalidating cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":51,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:51:12)"},"keys":["plan:plan-6"],"enabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.557Z","level":"debug","service":"PlannerService","message":"Cache invalidated successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":53,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:53:12)"},"keysCount":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.557Z","level":"debug","service":"PlannerService","message":"Upserting stage in CRDT","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":560,"column":12,"frame":"at PlannerService.createStage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:560:12)"},"planId":"plan-6","stageId":"stage-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.557Z","level":"debug","service":"PlannerService","message":"Invalidating dashboard cache for plan owner","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":349,"column":14,"frame":"at PlannerService.invalidateDashboardCacheForPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:349:14)"},"planId":"plan-6"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.557Z","level":"debug","service":"PlannerService","message":"Invalidating dashboard cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":62,"column":12,"frame":"at PlannerService.invalidateDashboardCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:62:12)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.557Z","level":"debug","service":"PlannerService","message":"Dashboard cache invalidated for owner","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":353,"column":16,"frame":"at PlannerService.invalidateDashboardCacheForPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:353:16)"},"planId":"plan-6","userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.558Z","level":"info","service":"PlannerController","message":"Stage created via controller","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts","line":465,"column":14,"frame":"at PlannerController.createStage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.controller.ts:465:14)"},"planId":"plan-6","stageId":"stage-1","userId":"test-user-1"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/planner/__tests__/planner.integration.test.ts (13 tests) 65ms @my-roadtrip/api:test:unit: stdout | src/modules/users/__tests__/users.service.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: βš™οΈ load multiple .env files with { path: ['.env.local', '.env'] } @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/gamification/__tests__/document-mapping.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ”„ add secrets lifecycle management: https://dotenvx.com/ops @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/live/__tests__/liveNavigation.service.participants.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ—‚οΈ backup and recover secrets: https://dotenvx.com/ops @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.service.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ”‘ add access controls to secrets: https://dotenvx.com/ops @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/middleware/__tests__/auth-issue-005.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ” encrypt with Dotenvx: https://dotenvx.com @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.middleware.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ› οΈ run anywhere with `dotenvx run -- yourcommand` @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/middleware/__tests__/auth-issue-005.test.ts (8 tests) 2ms @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.controller.test.ts > AIController > suggestPOIs > returns cached result when available @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.616Z","level":"info","service":"AIController","message":"Suggest POIs request received","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":238,"column":14,"frame":"at AIController.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:238:14)"},"userId":"user-1","categoriesCount":1,"radiusKm":25} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.619Z","level":"info","service":"AIController","message":"POI suggestion cache hit","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":260,"column":16,"frame":"at AIController.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:260:16)"},"userId":"user-1","cacheKey":"ai:poi:geo:u09tvw:r25:restaurant","processingTimeMs":3} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.controller.test.ts > AIController > suggestPOIs > queues job when no cache is found @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.621Z","level":"info","service":"AIController","message":"Suggest POIs request received","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":238,"column":14,"frame":"at AIController.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:238:14)"},"userId":"user-1","categoriesCount":1,"radiusKm":25} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.621Z","level":"info","service":"AIController","message":"POI suggestion job enqueued","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":351,"column":14,"frame":"at AIController.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:351:14)"},"userId":"user-1","jobId":"job-123","categoriesCount":1,"radiusKm":25} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stderr | src/modules/ai/__tests__/ai.controller.test.ts > AIController > suggestPOIs > handles repository errors with ApiResponse @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.622Z","level":"error","service":"AIController","message":"Failed to queue POI suggestion","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":366,"column":14,"frame":"at AIController.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:366:14)"},"error":{"name":"Error","message":"redis down","stack":"Error: redis down\n at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/__tests__/ai.controller.test.ts:135:58\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:533:11\n at runWithTimeout (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:39:7)\n at runTest (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:1056:17)"},"userId":"user-1"} @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.controller.test.ts > AIController > suggestPOIs > handles repository errors with ApiResponse @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.621Z","level":"info","service":"AIController","message":"Suggest POIs request received","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":238,"column":14,"frame":"at AIController.suggestPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:238:14)"},"userId":"user-1","categoriesCount":1,"radiusKm":25} @my-roadtrip/api:test:unit: stderr | src/modules/ai/__tests__/ai.controller.test.ts > AIController > enhancePlan > handles queue errors @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.623Z","level":"error","service":"AIController","message":"Failed to queue plan enhancement job","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":504,"column":14,"frame":"at AIController.enhancePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:504:14)"},"error":{"name":"Error","message":"queue failed","stack":"Error: queue failed\n at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/__tests__/ai.controller.test.ts:185:60\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:533:11\n at runWithTimeout (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:39:7)\n at runTest (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:1056:17)"},"userId":"user-1"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stderr | src/modules/ai/__tests__/ai.controller.test.ts > AIController > getJobStatus > handles missing jobs with 404 @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.controller.test.ts > AIController > enhancePlan > queues enhancement job when fuel is available @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.622Z","level":"info","service":"AIController","message":"Enhance plan request received","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":472,"column":14,"frame":"at AIController.enhancePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:472:14)"},"userId":"user-1","planId":"plan-1","stopsCount":1,"constraints":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.622Z","level":"info","service":"AIController","message":"Plan enhancement job enqueued","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":501,"column":14,"frame":"at AIController.enhancePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:501:14)"},"userId":"user-1","planId":"plan-1","jobId":"job-456"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.controller.test.ts > AIController > enhancePlan > returns 400 when user lacks fuel @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.623Z","level":"info","service":"AIController","message":"Enhance plan request received","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":472,"column":14,"frame":"at AIController.enhancePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:472:14)"},"userId":"user-1","planId":"plan-1","stopsCount":0,"constraints":0} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.625Z","level":"error","service":"AIController","message":"Failed to fetch AI job status","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":522,"column":14,"frame":"at AIController.getJobStatus (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:522:14)"},"error":{"name":"Error","message":"missing","stack":"Error: missing\n at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/__tests__/ai.controller.test.ts:241:52\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:533:11\n at runWithTimeout (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:39:7)\n at runTest (file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:1056:17)"},"jobId":"job-2"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.623Z","level":"warn","service":"AIController","message":"Enhance plan blocked: insufficient fuel","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":482,"column":16,"frame":"at AIController.enhancePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:482:16)"},"userId":"user-1","planId":"plan-1"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.controller.test.ts > AIController > enhancePlan > handles queue errors @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.623Z","level":"info","service":"AIController","message":"Enhance plan request received","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":472,"column":14,"frame":"at AIController.enhancePlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:472:14)"},"userId":"user-1","planId":"plan-1","stopsCount":0,"constraints":0} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.controller.test.ts > AIController > getContextualSuggestions > returns POIs along the route @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.624Z","level":"info","service":"AIController","message":"Contextual suggestions requested","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":551,"column":14,"frame":"at AIController.getContextualSuggestions (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:551:14)"},"userId":"user-1","timeAvailable":60,"query":"coffee"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.624Z","level":"info","service":"AIController","message":"Contextual suggestions generated","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":565,"column":14,"frame":"at AIController.getContextualSuggestions (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:565:14)"},"userId":"user-1","results":1,"durationMs":0} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.controller.test.ts > AIController > getJobStatus > returns job status from service @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.624Z","level":"debug","service":"AIController","message":"Fetching AI job status","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":517,"column":14,"frame":"at AIController.getJobStatus (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:517:14)"},"jobId":"job-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.624Z","level":"info","service":"AIController","message":"AI job status resolved","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":519,"column":14,"frame":"at AIController.getJobStatus (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:519:14)"},"jobId":"job-1","state":"completed"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.controller.test.ts > AIController > getJobStatus > handles missing jobs with 404 @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.625Z","level":"debug","service":"AIController","message":"Fetching AI job status","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts","line":517,"column":14,"frame":"at AIController.getJobStatus (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.controller.ts:517:14)"},"jobId":"job-2"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/ai/__tests__/ai.controller.test.ts (11 tests) 11ms @my-roadtrip/api:test:unit: βœ“ src/modules/gamification/__tests__/document-mapping.test.ts (4 tests) 2ms @my-roadtrip/api:test:unit: βœ“ src/modules/ai/__tests__/ai.middleware.test.ts (6 tests) 3ms @my-roadtrip/api:test:unit: βœ“ src/modules/live/__tests__/liveNavigation.service.participants.test.ts (1 test) 1ms @my-roadtrip/api:test:unit: stdout | src/services/__tests__/google-places.service.test.ts > GooglePlacesService > verifyPlace > should return low confidence when API key is missing @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.650Z","level":"debug","service":"GooglePlacesService","message":"Processing batch of 1 verifications","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts","line":108,"column":12,"frame":"at GooglePlacesService.processBatch (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts:108:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stderr | src/services/__tests__/google-places.service.test.ts > GooglePlacesService > verifyPlace > should return low confidence when API key is missing @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.651Z","level":"error","service":"GooglePlacesService","message":"Google Places verification error","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts","line":229,"column":14,"frame":"at GooglePlacesService.verifyPlaceImmediate (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts:229:14)"},"error":{"name":"TypeError","message":"Cannot read properties of undefined (reading 'ok')","stack":"TypeError: Cannot read properties of undefined (reading 'ok')\n at GooglePlacesService.verifyPlaceImmediate (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts:154:21)\n at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts:114:26\n at async Promise.all (index 0)\n at GooglePlacesService.processBatch (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts:111:5)"},"query":"Test Place","target":{"lat":48.8584,"lng":2.2945}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/users/__tests__/users.service.test.ts > UsersService > computes stats when no cached snapshot exists @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.646Z","level":"debug","service":"UsersService","message":"Resolving user stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.service.ts","line":29,"column":12,"frame":"at UsersService.calculateUserStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.service.ts:29:12)"},"userId":"user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.648Z","level":"debug","service":"UsersService","message":"User stats cache miss","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.service.ts","line":36,"column":14,"frame":"at UsersService.calculateUserStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.service.ts:36:14)"},"userId":"user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.649Z","level":"info","service":"UsersService","message":"Computing user stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.service.ts","line":341,"column":12,"frame":"at UsersService.buildUserStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.service.ts:341:12)"},"userId":"user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.649Z","level":"info","service":"UsersService","message":"User stats computed","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.service.ts","line":348,"column":12,"frame":"at UsersService.buildUserStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.service.ts:348:12)"},"userId":"user-1","trips":1,"totalKm":100} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.649Z","level":"debug","service":"UsersService","message":"User stats cached","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.service.ts","line":106,"column":16,"frame":"at UsersService.cacheStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.service.ts:106:16)"},"userId":"user-1","ttl":3600} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/users/__tests__/users.service.test.ts > UsersService > serves cached stats when present @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.649Z","level":"debug","service":"UsersService","message":"Resolving user stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.service.ts","line":29,"column":12,"frame":"at UsersService.calculateUserStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.service.ts:29:12)"},"userId":"user-2"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.649Z","level":"debug","service":"UsersService","message":"User stats cache hit","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.service.ts","line":33,"column":16,"frame":"at UsersService.calculateUserStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.service.ts:33:16)"},"userId":"user-2"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/users/__tests__/users.service.test.ts (5 tests) 7ms @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.service.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (35) from .env -- tip: πŸ› οΈ run anywhere with `dotenvx run -- yourcommand` @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.service.test.ts @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.658Z","level":"info","service":"redis-config","message":"Forcing Upstash Redis (REDIS_DRIVER=upstash)","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts","line":51,"column":12,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts:51:12"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.661Z","level":"info","service":"redis","message":"Using Upstash Redis client","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts","line":36,"column":12,"frame":"at new UpstashRedisAdapter (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts:36:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/collab/__tests__/collab-issue-004.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: βœ… audit secrets and track compliance: https://dotenvx.com/ops @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/collab/__tests__/collab-issue-004.test.ts (8 tests) 2ms @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.service.test.ts > PlannerService.getCurrentPlan > returns existing default plan when available @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.698Z","level":"info","service":"PlannerService","message":"Ensuring current plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":464,"column":12,"frame":"at PlannerService.getCurrentPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:464:12)"},"userId":"user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.699Z","level":"debug","service":"PlannerService","message":"Found existing default plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":468,"column":14,"frame":"at PlannerService.getCurrentPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:468:14)"},"userId":"user-1","planId":"default-plan"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.service.test.ts > PlannerService.getCurrentPlan > promotes most recent plan when no default exists @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.699Z","level":"info","service":"PlannerService","message":"Ensuring current plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":464,"column":12,"frame":"at PlannerService.getCurrentPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:464:12)"},"userId":"user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.699Z","level":"debug","service":"PlannerService","message":"Using most recent plan as default","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":474,"column":14,"frame":"at PlannerService.getCurrentPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:474:14)"},"userId":"user-1","planId":"recent-plan"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.700Z","level":"debug","service":"PlannerService","message":"Invalidating cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":51,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:51:12)"},"keys":["plan:user:user-1","plan:recent-plan"],"enabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.700Z","level":"debug","service":"PlannerService","message":"Cache invalidated successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":53,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:53:12)"},"keysCount":2} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/planner/__tests__/planner.service.test.ts > PlannerService.getCurrentPlan > creates a default plan when user has none @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.700Z","level":"info","service":"PlannerService","message":"Ensuring current plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":464,"column":12,"frame":"at PlannerService.getCurrentPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:464:12)"},"userId":"user-2"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.700Z","level":"info","service":"PlannerService","message":"No plans found for user, creating default plan","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":484,"column":12,"frame":"at PlannerService.getCurrentPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:484:12)"},"userId":"user-2"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.700Z","level":"info","service":"PlannerService","message":"Creating default plan for user","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":852,"column":12,"frame":"at PlannerService.createDefaultPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:852:12)"},"userId":"user-2"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.701Z","level":"debug","service":"PlannerService","message":"Invalidating cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":51,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:51:12)"},"keys":["plan:user:user-2","plan:new-plan"],"enabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.701Z","level":"debug","service":"PlannerService","message":"Cache invalidated successfully","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":53,"column":12,"frame":"at PlannerService.invalidateCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:53:12)"},"keysCount":2} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.701Z","level":"debug","service":"PlannerService","message":"Invalidating dashboard cache","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":62,"column":12,"frame":"at PlannerService.invalidateDashboardCache (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:62:12)"},"userId":"user-2"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.701Z","level":"debug","service":"PlannerService","message":"Default plan created","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts","line":869,"column":12,"frame":"at PlannerService.createDefaultPlan (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/planner/planner.service.ts:869:12)"},"userId":"user-2","planId":"new-plan"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/planner/__tests__/planner.service.test.ts (3 tests) 4ms @my-roadtrip/api:test:unit: stdout | src/modules/budget/__tests__/budget.service.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: βš™οΈ enable debug logging with { debug: true } @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.routes.integration.test.ts > AI Routes Integration Tests @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.732Z","level":"warn","service":"ai.routes.integration.test","message":"[ai.routes.integration] Unable to start Redis testcontainer, using local fallback","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/__tests__/ai.routes.integration.test.ts","line":129,"column":16,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/__tests__/ai.routes.integration.test.ts:129:16"},"error":"Could not find a working container runtime strategy"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.routes.integration.test.ts > AI Routes Integration Tests > POST /api/ai/suggest-pois > should queue POI suggestion job @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.743Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.744Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.routes.integration.test.ts > AI Routes Integration Tests > POST /api/ai/suggest-pois > should validate required fields @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.748Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.748Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.routes.integration.test.ts > AI Routes Integration Tests > POST /api/ai/suggest-pois > should reject invalid coordinates @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.751Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.751Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/services/__tests__/google-places.service.test.ts > GooglePlacesService > verifyPlace > should calculate distance-based confidence correctly @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.753Z","level":"debug","service":"GooglePlacesService","message":"Processing batch of 1 verifications","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts","line":108,"column":12,"frame":"at GooglePlacesService.processBatch (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts:108:12)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.754Z","level":"debug","service":"GooglePlacesService","message":"Google Places verification result","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts","line":208,"column":14,"frame":"at GooglePlacesService.verifyPlaceImmediate (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/services/google-places.service.ts:208:14)"},"query":"Nearby Cafe","matched":true,"confidence":98,"distanceMeters":13.31027312678081,"placeId":"ChIJ456"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/services/__tests__/google-places.service.test.ts (8 tests) 521ms @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.routes.integration.test.ts > AI Routes Integration Tests > POST /api/ai/enhance-plan > should queue plan enhancement job @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.755Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.755Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.routes.integration.test.ts > AI Routes Integration Tests > POST /api/ai/enhance-plan > should validate stops array @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.757Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.758Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.routes.integration.test.ts > AI Routes Integration Tests > GET /api/ai/jobs/:jobId > should return job status @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.762Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.762Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.routes.integration.test.ts > AI Routes Integration Tests > GET /api/ai/usage > should return user quota stats @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.764Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"test-user-1"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.routes.integration.test.ts > AI Routes Integration Tests > Rate limiting > should enforce quota limits @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.767Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"free-user"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.768Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.768Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"free-user"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.768Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.768Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"free-user"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.768Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.768Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"free-user"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.768Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.768Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"free-user"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.769Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.769Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"free-user"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.769Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.769Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"free-user"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.769Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.769Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"free-user"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.769Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.769Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"free-user"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.769Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.769Z","level":"debug","service":"AIRepository","message":"Returning stub AI usage stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":313,"column":14,"frame":"at AIRepository.getUsageStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:313:14)"},"userId":"free-user"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.769Z","level":"debug","service":"AIRepository","message":"AI usage increment skipped (billing is source of truth)","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":322,"column":12,"frame":"at AIRepository.incrementUsage (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:322:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/ai/__tests__/ai.routes.integration.test.ts (16 tests) 42ms @my-roadtrip/api:test:unit: stdout | src/modules/budget/__tests__/budget.service.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (35) from .env -- tip: πŸ”‘ add access controls to secrets: https://dotenvx.com/ops @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/users/__tests__/users.controller.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ” encrypt with Dotenvx: https://dotenvx.com @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.repository.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: βš™οΈ load multiple .env files with { path: ['.env.local', '.env'] } @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/collab/__tests__/collab.service.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: βš™οΈ write to custom object with { processEnv: myObject } @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/live/__tests__/liveDistance.utils.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ” prevent building .env in docker: https://dotenvx.com/prebuild @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/common/utils/__tests__/health.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ“‘ add observability to secrets: https://dotenvx.com/ops @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.service.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: βš™οΈ load multiple .env files with { path: ['.env.local', '.env'] } @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.repository.test.ts > AIRepository (current behavior) > returns cached POIs when cache is present @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (34) from .env -- tip: βš™οΈ write to custom object with { processEnv: myObject } @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.repository.test.ts > AIRepository (current behavior) > returns cached POIs when cache is present @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.876Z","level":"info","service":"redis-config","message":"Forcing Upstash Redis (REDIS_DRIVER=upstash)","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts","line":51,"column":12,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts:51:12"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.878Z","level":"info","service":"redis","message":"Using Upstash Redis client","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts","line":36,"column":12,"frame":"at new UpstashRedisAdapter (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts:36:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/live/__tests__/liveDistance.utils.test.ts (4 tests) 3ms @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.service.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (35) from .env -- tip: πŸ” encrypt with Dotenvx: https://dotenvx.com @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.881Z","level":"info","service":"redis-config","message":"Forcing Upstash Redis (REDIS_DRIVER=upstash)","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts","line":51,"column":12,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts:51:12"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.repository.test.ts > AIRepository (current behavior) > returns cached POIs when cache is present @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.883Z","level":"debug","service":"AIRepository","message":"Fetching nearby POIs","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":170,"column":12,"frame":"at AIRepository.getNearbyPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:170:12)"},"lat":1,"lng":2,"radiusKm":10} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.884Z","level":"debug","service":"AIRepository","message":"POIs cache miss","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":185,"column":16,"frame":"at AIRepository.getNearbyPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:185:16)"},"cacheKey":"pois:1.00:2.00:10"} @my-roadtrip/api:test:unit: stderr | src/modules/ai/__tests__/ai.repository.test.ts > AIRepository (current behavior) > returns cached POIs when cache is present @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.884Z","level":"debug","service":"AIRepository","message":"Querying POIs from Firestore","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":194,"column":14,"frame":"at AIRepository.getNearbyPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:194:14)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.885Z","level":"error","service":"AIRepository","message":"Failed to fetch POIs from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":233,"column":14,"frame":"at AIRepository.getNearbyPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:233:14)"},"error":{"name":"Error","message":"Firebase has not been initialized. Call initializeFirebase() first.","stack":"Error: Firebase has not been initialized. Call initializeFirebase() first.\n at ensureInitialized (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/firebase.ts:25:11)\n at Object.get (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/firebase.ts:31:5)\n at AIRepository.getNearbyPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:195:33)\n at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/__tests__/ai.repository.test.ts:67:20\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:533:5"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.service.test.ts > AIService (core behaviors) > queues POI suggestion and returns job id @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.886Z","level":"info","service":"AIService","message":"Queueing POI suggestion job","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts","line":38,"column":12,"frame":"at AIService.queuePOISuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts:38:12)"},"userId":"user-1","location":{"lat":1,"lng":2},"categories":["park"],"radiusKm":10} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.887Z","level":"info","service":"AIService","message":"POI suggestion job queued","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts","line":52,"column":12,"frame":"at AIService.queuePOISuggestion (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts:52:12)"},"jobId":"test-1","userId":"user-1"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.service.test.ts > AIService (core behaviors) > returns job status for completed job @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.887Z","level":"debug","service":"AIService","message":"Fetching AI job status","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts","line":90,"column":12,"frame":"at AIService.getJobStatus (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts:90:12)"},"jobId":"job-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.887Z","level":"debug","service":"AIService","message":"AI job state retrieved","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts","line":105,"column":12,"frame":"at AIService.getJobStatus (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts:105:12)"},"jobId":"job-1","state":"waiting"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.887Z","level":"debug","service":"AIService","message":"AI job in progress","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts","line":127,"column":12,"frame":"at AIService.getJobStatus (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts:127:12)"},"jobId":"job-1","state":"waiting","progress":0,"attempts":0} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.service.test.ts > AIService (core behaviors) > marks queue unhealthy on high pending volume @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.888Z","level":"debug","service":"AIService","message":"Fetching AI queue status","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts","line":137,"column":12,"frame":"at AIService.getQueueStatus (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts:137:12)"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.888Z","level":"debug","service":"AIService","message":"AI queue counts retrieved","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts","line":158,"column":12,"frame":"at AIService.getQueueStatus (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts:158:12)"},"counts":{"waiting":0,"active":0,"completed":0,"failed":0,"delayed":0,"paused":0}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.888Z","level":"info","service":"AIService","message":"AI queue status","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts","line":173,"column":12,"frame":"at AIService.getQueueStatus (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.service.ts:173:12)"},"waiting":0,"active":0,"completed":0,"failed":0,"health":"healthy"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/users/__tests__/users.controller.test.ts > UsersController > returns unauthorized when user missing for stats @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.882Z","level":"warn","service":"UsersController","message":"Unauthorized user stats request","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts","line":21,"column":16,"frame":"at UsersController.getUserStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts:21:16)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/users/__tests__/users.controller.test.ts > UsersController > fetches stats when user present @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.885Z","level":"debug","service":"UsersController","message":"Fetching user stats","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts","line":24,"column":14,"frame":"at UsersController.getUserStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts:24:14)"},"userId":"u1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.886Z","level":"info","service":"UsersController","message":"User stats fetched","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts","line":26,"column":14,"frame":"at UsersController.getUserStats (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts:26:14)"},"userId":"u1"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/users/__tests__/users.controller.test.ts > UsersController > rejects invalid location payload @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.886Z","level":"debug","service":"UsersController","message":"Updating user location","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts","line":43,"column":14,"frame":"at UsersController.updateLocation (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts:43:14)"},"userId":"u1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.887Z","level":"warn","service":"UsersController","message":"Invalid location payload","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts","line":46,"column":16,"frame":"at UsersController.updateLocation (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts:46:16)"},"userId":"u1"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/users/__tests__/users.controller.test.ts > UsersController > updates location when payload valid @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.887Z","level":"debug","service":"UsersController","message":"Updating user location","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts","line":43,"column":14,"frame":"at UsersController.updateLocation (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts:43:14)"},"userId":"u1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.887Z","level":"info","service":"UsersController","message":"User location updated","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts","line":57,"column":14,"frame":"at UsersController.updateLocation (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts:57:14)"},"userId":"u1"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/users/__tests__/users.controller.test.ts > UsersController > returns location summary when authenticated @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.888Z","level":"debug","service":"UsersController","message":"Fetching user location summary","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts","line":75,"column":14,"frame":"at UsersController.getLocationSummary (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts:75:14)"},"userId":"u1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.888Z","level":"info","service":"UsersController","message":"User location summary fetched","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts","line":77,"column":14,"frame":"at UsersController.getLocationSummary (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/users/users.controller.ts:77:14)"},"userId":"u1"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/users/__tests__/users.controller.test.ts (5 tests) 7ms @my-roadtrip/api:test:unit: βœ“ src/modules/ai/__tests__/ai.service.test.ts (3 tests) 3ms @my-roadtrip/api:test:unit: βœ“ src/common/utils/__tests__/health.test.ts (4 tests) 13ms @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.repository.test.ts > AIRepository (current behavior) > falls back to Firestore when cache is empty @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env -- tip: πŸ”„ add secrets lifecycle management: https://dotenvx.com/ops @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.quota.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: πŸ“‘ add observability to secrets: https://dotenvx.com/ops @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.repository.test.ts > AIRepository (current behavior) > falls back to Firestore when cache is empty @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.915Z","level":"info","service":"redis-config","message":"Forcing Upstash Redis (REDIS_DRIVER=upstash)","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts","line":51,"column":12,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts:51:12"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.916Z","level":"info","service":"redis","message":"Using Upstash Redis client","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts","line":36,"column":12,"frame":"at new UpstashRedisAdapter (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts:36:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stderr | src/modules/ai/__tests__/ai.repository.test.ts > AIRepository (current behavior) > falls back to Firestore when cache is empty @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.922Z","level":"error","service":"AIRepository","message":"Failed to fetch POIs from database","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":233,"column":14,"frame":"at AIRepository.getNearbyPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:233:14)"},"error":{"name":"Error","message":"Firebase has not been initialized. Call initializeFirebase() first.","stack":"Error: Firebase has not been initialized. Call initializeFirebase() first.\n at ensureInitialized (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/firebase.ts:25:11)\n at Object.get (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/firebase.ts:31:5)\n at AIRepository.getNearbyPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:195:33)\n at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/__tests__/ai.repository.test.ts:74:20\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:533:5"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.repository.test.ts > AIRepository (current behavior) > falls back to Firestore when cache is empty @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.922Z","level":"debug","service":"AIRepository","message":"Fetching nearby POIs","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":170,"column":12,"frame":"at AIRepository.getNearbyPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:170:12)"},"lat":1,"lng":2,"radiusKm":5} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.922Z","level":"debug","service":"AIRepository","message":"POIs cache miss","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":185,"column":16,"frame":"at AIRepository.getNearbyPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:185:16)"},"cacheKey":"pois:1.00:2.00:5"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.922Z","level":"debug","service":"AIRepository","message":"Querying POIs from Firestore","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts","line":194,"column":14,"frame":"at AIRepository.getNearbyPOIs (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/ai/ai.repository.ts:194:14)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/ai/__tests__/ai.quota.test.ts (2 tests) 2ms @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.repository.test.ts > AIRepository (current behavior) > returns cached result when Redis client already deserializes JSON @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env -- tip: πŸ”„ add secrets lifecycle management: https://dotenvx.com/ops @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.repository.test.ts > AIRepository (current behavior) > returns cached result when Redis client already deserializes JSON @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.944Z","level":"info","service":"redis-config","message":"Forcing Upstash Redis (REDIS_DRIVER=upstash)","caller":{"file":" at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts","line":51,"column":12,"frame":"at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/config/redisConfig.ts:51:12"}} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:57.944Z","level":"info","service":"redis","message":"Using Upstash Redis client","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts","line":36,"column":12,"frame":"at new UpstashRedisAdapter (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/core/database/redis.ts:36:12)"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/ai/__tests__/ai.repository.test.ts (3 tests) 98ms @my-roadtrip/api:test:unit: βœ“ src/modules/budget/__tests__/budget.service.test.ts (3 tests) 3ms @my-roadtrip/api:test:unit: βœ“ src/modules/collab/__tests__/collab.service.test.ts (3 tests) 5ms @my-roadtrip/api:test:unit: stdout | src/modules/collab/__tests__/collab.service.test.ts > CollabService.getPresence > skips malformed presence payloads without throwing @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:58.082Z","level":"warn","service":"CollabService","message":"Skipping invalid presence payload","caller":{"file":"/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/collab/collab.service.ts","line":343,"column":14,"frame":"at CollabService.parsePresenceEntry (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/collab/collab.service.ts:343:14)"},"planId":"plan-2","error":{"name":"SyntaxError","message":"Expected property name or '}' in JSON at position 1 (line 1 column 2)","stack":"SyntaxError: Expected property name or '}' in JSON at position 1 (line 1 column 2)\n at JSON.parse ()\n at CollabService.parsePresenceEntry (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/collab/collab.service.ts:315:27)\n at CollabService.getPresence (/Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/collab/collab.service.ts:385:26)\n at /Users/floriansola/Documents/MyRoadTrip/apps/api/src/modules/collab/__tests__/collab.service.test.ts:75:20\n at file:///Users/floriansola/Documents/MyRoadTrip/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:533:5"}} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: ⎯⎯⎯⎯⎯⎯ Unhandled Errors ⎯⎯⎯⎯⎯⎯ @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: Vitest caught 5 unhandled errors during the test run. @my-roadtrip/api:test:unit: This might cause false positive tests. Resolve unhandled errors to make sure your tests are not affected. @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: ⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯ @my-roadtrip/api:test:unit: Error: [vitest] No "closeAIQueue" export is defined on the "../../../core/queue/ai-queue" mock. Did you forget to return it from "vi.mock"? @my-roadtrip/api:test:unit: If you need to partially mock a module, you can use "importOriginal" helper inside: @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: vi.mock(import("../../../core/queue/ai-queue"), async (importOriginal) => { @my-roadtrip/api:test:unit: const actual = await importOriginal() @my-roadtrip/api:test:unit: return { @my-roadtrip/api:test:unit: ...actual, @my-roadtrip/api:test:unit: // your mocked methods @my-roadtrip/api:test:unit: } @my-roadtrip/api:test:unit: }) @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: ❯ VitestMocker.createError ../../node_modules/.pnpm/vitest@2.1.9_@types+node@22.19.1_@vitest+ui@2.1.9_happy-dom@15.11.7_sass@1.94.1_terser@5.44.1/node_modules/vitest/dist/chunks/execute.2pr0rHgK.js:321:19 @my-roadtrip/api:test:unit: ❯ Object.get ../../node_modules/.pnpm/vitest@2.1.9_@types+node@22.19.1_@vitest+ui@2.1.9_happy-dom@15.11.7_sass@1.94.1_terser@5.44.1/node_modules/vitest/dist/chunks/execute.2pr0rHgK.js:389:22 @my-roadtrip/api:test:unit: ❯ process. src/core/queue/ai.worker.ts:105:11 @my-roadtrip/api:test:unit: 103| for (const signal of ['SIGINT', 'SIGTERM']) { @my-roadtrip/api:test:unit: 104| process.once(signal, async () => { @my-roadtrip/api:test:unit: 105| await closeAIQueue() @my-roadtrip/api:test:unit: | ^ @my-roadtrip/api:test:unit: 106| }) @my-roadtrip/api:test:unit: 107| } @my-roadtrip/api:test:unit: ❯ Object.onceWrapper node:events:623:26 @my-roadtrip/api:test:unit: ❯ process.emit node:events:520:35 @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: This error originated in "src/modules/ai/__tests__/ai.worker.integration.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running. @my-roadtrip/api:test:unit: This error was caught after test environment was torn down. Make sure to cancel any running tasks before test finishes: @my-roadtrip/api:test:unit: - cancel timeouts using clearTimeout and clearInterval @my-roadtrip/api:test:unit: - wait for promises to resolve using the await keyword @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: ⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯ @my-roadtrip/api:test:unit: Error: [vitest] No "closeAIQueue" export is defined on the "../../../core/queue/ai-queue" mock. Did you forget to return it from "vi.mock"? @my-roadtrip/api:test:unit: If you need to partially mock a module, you can use "importOriginal" helper inside: @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: vi.mock(import("../../../core/queue/ai-queue"), async (importOriginal) => { @my-roadtrip/api:test:unit: const actual = await importOriginal() @my-roadtrip/api:test:unit: return { @my-roadtrip/api:test:unit: ...actual, @my-roadtrip/api:test:unit: // your mocked methods @my-roadtrip/api:test:unit: } @my-roadtrip/api:test:unit: }) @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: ❯ VitestMocker.createError ../../node_modules/.pnpm/vitest@2.1.9_@types+node@22.19.1_@vitest+ui@2.1.9_happy-dom@15.11.7_sass@1.94.1_terser@5.44.1/node_modules/vitest/dist/chunks/execute.2pr0rHgK.js:321:19 @my-roadtrip/api:test:unit: ❯ Object.get ../../node_modules/.pnpm/vitest@2.1.9_@types+node@22.19.1_@vitest+ui@2.1.9_happy-dom@15.11.7_sass@1.94.1_terser@5.44.1/node_modules/vitest/dist/chunks/execute.2pr0rHgK.js:389:22 @my-roadtrip/api:test:unit: ❯ process. src/core/queue/ai.worker.ts:105:11 @my-roadtrip/api:test:unit: 103| for (const signal of ['SIGINT', 'SIGTERM']) { @my-roadtrip/api:test:unit: 104| process.once(signal, async () => { @my-roadtrip/api:test:unit: 105| await closeAIQueue() @my-roadtrip/api:test:unit: | ^ @my-roadtrip/api:test:unit: 106| }) @my-roadtrip/api:test:unit: 107| } @my-roadtrip/api:test:unit: ❯ Object.onceWrapper node:events:623:26 @my-roadtrip/api:test:unit: ❯ process.emit node:events:520:35 @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: This error originated in "src/modules/ai/__tests__/ai.worker.integration.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running. @my-roadtrip/api:test:unit: This error was caught after test environment was torn down. Make sure to cancel any running tasks before test finishes: @my-roadtrip/api:test:unit: - cancel timeouts using clearTimeout and clearInterval @my-roadtrip/api:test:unit: - wait for promises to resolve using the await keyword @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: ⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯ @my-roadtrip/api:test:unit: Error: [vitest] No "closeAIQueue" export is defined on the "../../../core/queue/ai-queue" mock. Did you forget to return it from "vi.mock"? @my-roadtrip/api:test:unit: If you need to partially mock a module, you can use "importOriginal" helper inside: @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: vi.mock(import("../../../core/queue/ai-queue"), async (importOriginal) => { @my-roadtrip/api:test:unit: const actual = await importOriginal() @my-roadtrip/api:test:unit: return { @my-roadtrip/api:test:unit: ...actual, @my-roadtrip/api:test:unit: // your mocked methods @my-roadtrip/api:test:unit: } @my-roadtrip/api:test:unit: }) @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: ❯ VitestMocker.createError ../../node_modules/.pnpm/vitest@2.1.9_@types+node@22.19.1_@vitest+ui@2.1.9_happy-dom@15.11.7_sass@1.94.1_terser@5.44.1/node_modules/vitest/dist/chunks/execute.2pr0rHgK.js:321:19 @my-roadtrip/api:test:unit: ❯ Object.get ../../node_modules/.pnpm/vitest@2.1.9_@types+node@22.19.1_@vitest+ui@2.1.9_happy-dom@15.11.7_sass@1.94.1_terser@5.44.1/node_modules/vitest/dist/chunks/execute.2pr0rHgK.js:389:22 @my-roadtrip/api:test:unit: ❯ process. src/core/queue/ai.worker.ts:105:11 @my-roadtrip/api:test:unit: 103| for (const signal of ['SIGINT', 'SIGTERM']) { @my-roadtrip/api:test:unit: 104| process.once(signal, async () => { @my-roadtrip/api:test:unit: 105| await closeAIQueue() @my-roadtrip/api:test:unit: | ^ @my-roadtrip/api:test:unit: 106| }) @my-roadtrip/api:test:unit: 107| } @my-roadtrip/api:test:unit: ❯ Object.onceWrapper node:events:623:26 @my-roadtrip/api:test:unit: ❯ process.emit node:events:520:35 @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: This error originated in "src/modules/ai/__tests__/ai.worker.integration.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running. @my-roadtrip/api:test:unit: This error was caught after test environment was torn down. Make sure to cancel any running tasks before test finishes: @my-roadtrip/api:test:unit: - cancel timeouts using clearTimeout and clearInterval @my-roadtrip/api:test:unit: - wait for promises to resolve using the await keyword @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: ⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯ @my-roadtrip/api:test:unit: Error: [vitest] No "closeAIQueue" export is defined on the "../../../core/queue/ai-queue" mock. Did you forget to return it from "vi.mock"? @my-roadtrip/api:test:unit: If you need to partially mock a module, you can use "importOriginal" helper inside: @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: vi.mock(import("../../../core/queue/ai-queue"), async (importOriginal) => { @my-roadtrip/api:test:unit: const actual = await importOriginal() @my-roadtrip/api:test:unit: return { @my-roadtrip/api:test:unit: ...actual, @my-roadtrip/api:test:unit: // your mocked methods @my-roadtrip/api:test:unit: } @my-roadtrip/api:test:unit: }) @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: ❯ VitestMocker.createError ../../node_modules/.pnpm/vitest@2.1.9_@types+node@22.19.1_@vitest+ui@2.1.9_happy-dom@15.11.7_sass@1.94.1_terser@5.44.1/node_modules/vitest/dist/chunks/execute.2pr0rHgK.js:321:19 @my-roadtrip/api:test:unit: ❯ Object.get ../../node_modules/.pnpm/vitest@2.1.9_@types+node@22.19.1_@vitest+ui@2.1.9_happy-dom@15.11.7_sass@1.94.1_terser@5.44.1/node_modules/vitest/dist/chunks/execute.2pr0rHgK.js:389:22 @my-roadtrip/api:test:unit: ❯ process. src/core/queue/ai.worker.ts:105:11 @my-roadtrip/api:test:unit: 103| for (const signal of ['SIGINT', 'SIGTERM']) { @my-roadtrip/api:test:unit: 104| process.once(signal, async () => { @my-roadtrip/api:test:unit: 105| await closeAIQueue() @my-roadtrip/api:test:unit: | ^ @my-roadtrip/api:test:unit: 106| }) @my-roadtrip/api:test:unit: 107| } @my-roadtrip/api:test:unit: ❯ Object.onceWrapper node:events:623:26 @my-roadtrip/api:test:unit: ❯ process.emit node:events:520:35 @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: This error originated in "src/modules/ai/__tests__/ai.worker.integration.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running. @my-roadtrip/api:test:unit: This error was caught after test environment was torn down. Make sure to cancel any running tasks before test finishes: @my-roadtrip/api:test:unit: - cancel timeouts using clearTimeout and clearInterval @my-roadtrip/api:test:unit: - wait for promises to resolve using the await keyword @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: ⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯ @my-roadtrip/api:test:unit: Error: [vitest] No "closeAIQueue" export is defined on the "../../../core/queue/ai-queue" mock. Did you forget to return it from "vi.mock"? @my-roadtrip/api:test:unit: If you need to partially mock a module, you can use "importOriginal" helper inside: @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: vi.mock(import("../../../core/queue/ai-queue"), async (importOriginal) => { @my-roadtrip/api:test:unit: const actual = await importOriginal() @my-roadtrip/api:test:unit: return { @my-roadtrip/api:test:unit: ...actual, @my-roadtrip/api:test:unit: // your mocked methods @my-roadtrip/api:test:unit: } @my-roadtrip/api:test:unit: }) @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: ❯ VitestMocker.createError ../../node_modules/.pnpm/vitest@2.1.9_@types+node@22.19.1_@vitest+ui@2.1.9_happy-dom@15.11.7_sass@1.94.1_terser@5.44.1/node_modules/vitest/dist/chunks/execute.2pr0rHgK.js:321:19 @my-roadtrip/api:test:unit: ❯ Object.get ../../node_modules/.pnpm/vitest@2.1.9_@types+node@22.19.1_@vitest+ui@2.1.9_happy-dom@15.11.7_sass@1.94.1_terser@5.44.1/node_modules/vitest/dist/chunks/execute.2pr0rHgK.js:389:22 @my-roadtrip/api:test:unit: ❯ process. src/core/queue/ai.worker.ts:105:11 @my-roadtrip/api:test:unit: 103| for (const signal of ['SIGINT', 'SIGTERM']) { @my-roadtrip/api:test:unit: 104| process.once(signal, async () => { @my-roadtrip/api:test:unit: 105| await closeAIQueue() @my-roadtrip/api:test:unit: | ^ @my-roadtrip/api:test:unit: 106| }) @my-roadtrip/api:test:unit: 107| } @my-roadtrip/api:test:unit: ❯ Object.onceWrapper node:events:623:26 @my-roadtrip/api:test:unit: ❯ process.emit node:events:520:35 @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: This error originated in "src/modules/ai/__tests__/ai.worker.integration.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running. @my-roadtrip/api:test:unit: ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ @my-roadtrip/api:test:unit: This error was caught after test environment was torn down. Make sure to cancel any running tasks before test finishes: @my-roadtrip/api:test:unit: - cancel timeouts using clearTimeout and clearInterval @my-roadtrip/api:test:unit: - wait for promises to resolve using the await keyword @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: Test Files 30 passed (30) @my-roadtrip/api:test:unit: Tests 229 passed (229) @my-roadtrip/api:test:unit: Errors 5 errors @my-roadtrip/api:test:unit: Start at 15:19:56 @my-roadtrip/api:test:unit: Duration 1.46s (transform 1.04s, setup 554ms, collect 3.40s, tests 1.14s, environment 3ms, prepare 1.52s) @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit:  ELIFECYCLE  Command failed with exit code 1. @my-roadtrip/api:test:unit: ERROR: command finished with error: command (/Users/floriansola/Documents/MyRoadTrip/apps/api) /Users/floriansola/.pnpm-global/bin/pnpm run test:unit exited (1) @my-roadtrip/api#test:unit: command (/Users/floriansola/Documents/MyRoadTrip/apps/api) /Users/floriansola/.pnpm-global/bin/pnpm run test:unit exited (1) Tasks: 0 successful, 1 total Cached: 0 cached, 1 total Time: 2.115s Failed: @my-roadtrip/api#test:unit ERROR run failed: command exited (1)