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 de1d8590448fb67d @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/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/ai/__tests__/poi.processor.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__/overpass.service.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/ai/__tests__/ai.worker.integration.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/planner/__tests__/planner.integration.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/services/__tests__/google-places.service.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/modules/ai/__tests__/ai.controller.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/modules/ai/__tests__/ai.routes.integration.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/live/__tests__/liveReplay.builder.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/modules/analytics/__tests__/analytics.service.spec.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/services/__tests__/openai-enhanced-context.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: βš™οΈ override existing env vars with { override: true } @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: πŸ” prevent building .env in docker: https://dotenvx.com/prebuild @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__/ai.controller.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: {"timestamp":"2025-12-01T14:18:59.271Z","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__/poi.processor.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: @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: {"timestamp":"2025-12-01T14:18:59.270Z","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:18:59.275Z","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: stdout | src/services/__tests__/overpass.service.test.ts > OverpassService > searchNearby > should handle empty results @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.276Z","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:18:59.277Z","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: stdout | src/services/__tests__/overpass.service.test.ts > OverpassService > searchNearby > should handle API errors gracefully @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.277Z","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 handle API errors gracefully @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.277Z","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: @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:18:59.278Z","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: {"timestamp":"2025-12-01T14:19:24.278Z","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 > searchNearby > should map categories to OSM tags correctly @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.280Z","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:18:59.280Z","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: @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:18:59.282Z","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:18:59.282Z","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:18:59.282Z","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:18:59.283Z","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:18:59.283Z","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:18:59.283Z","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:18:59.283Z","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:18:59.283Z","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: 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:18:59.284Z","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:18:59.284Z","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) 16ms @my-roadtrip/api:test:unit: βœ“ src/modules/analytics/__tests__/analytics.service.spec.ts (2 tests) 95ms @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.controller.test.ts @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.320Z","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: πŸ” encrypt with Dotenvx: https://dotenvx.com @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: ❯ src/modules/ai/__tests__/ai.worker.integration.test.ts (5 tests | 5 failed) 177ms @my-roadtrip/api:test:unit: Γ— AI Worker Integration Tests > suggest-pois worker > uses OpenAI suggestions when available 107ms @my-roadtrip/api:test:unit: β†’ [vitest] No "getAIQueue" 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: Γ— AI Worker Integration Tests > suggest-pois worker > falls back to Mapbox Places when OpenAI fails 18ms @my-roadtrip/api:test:unit: β†’ [vitest] No "getAIQueue" 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: Γ— AI Worker Integration Tests > suggest-pois worker > uses database fallback when both providers fail 20ms @my-roadtrip/api:test:unit: β†’ [vitest] No "getAIQueue" 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: Γ— AI Worker Integration Tests > enhance-plan worker > enhances plans and writes updates to Firestore 14ms @my-roadtrip/api:test:unit: β†’ [vitest] No "getAIQueue" 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: Γ— AI Worker Integration Tests > enhance-plan worker > propagates errors when enhancement fails 17ms @my-roadtrip/api:test:unit: β†’ [vitest] No "getAIQueue" 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: 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:18:59.370Z","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:18:59.374Z","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/planner/__tests__/planner.integration.test.ts @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.383Z","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:18:59.389Z","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__/dashboard-insights.test.ts @my-roadtrip/api:test:unit: [dotenv@17.2.3] injecting env (0) from .env.test -- tip: βš™οΈ suppress all logs with { quiet: true } @my-roadtrip/api:test:unit: @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: πŸ‘₯ sync secrets across teammates & machines: 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:18:59.461Z","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:18:59.463Z","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:18:59.465Z","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:18:59.466Z","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:18:59.468Z","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:18:59.468Z","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:18:59.470Z","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:18:59.471Z","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:18:59.471Z","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:18:59.471Z","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:18:59.471Z","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:18:59.471Z","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:18:59.472Z","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:18:59.472Z","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:18:59.473Z","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:18:59.473Z","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:18:59.473Z","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:18:59.473Z","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:18:59.474Z","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:18:59.474Z","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:18:59.474Z","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:18:59.474Z","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/modules/ai/__tests__/poi.processor.test.ts @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.474Z","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:18:59.478Z","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/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:18:59.474Z","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:18:59.474Z","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:18:59.474Z","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:18:59.475Z","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:18:59.475Z","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:18:59.475Z","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:18:59.477Z","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:18:59.477Z","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: 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:18:59.475Z","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:18:59.476Z","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:18:59.477Z","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: 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:18:59.478Z","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:18:59.478Z","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: 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: @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.479Z","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) 22ms @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:18:59.487Z","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:18:59.488Z","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: βœ“ src/common/utils/__tests__/logger.test.ts (12 tests) 16ms @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: πŸ” encrypt with Dotenvx: https://dotenvx.com @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/planner/__tests__/dashboard-insights.test.ts (3 tests) 6ms @my-roadtrip/api:test:unit: βœ“ src/services/__tests__/openai-issue-006.test.ts (16 tests) 4ms @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:18:59.497Z","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:18:59.498Z","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:18:59.499Z","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:18:59.499Z","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:18:59.499Z","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:18:59.499Z","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:18:59.499Z","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:18:59.499Z","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:18:59.500Z","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:18:59.500Z","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:18:59.500Z","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:18:59.500Z","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:18:59.500Z","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:18:59.500Z","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 calculate agreement bonus when both sources match @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.501Z","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:18:59.501Z","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:18:59.501Z","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:18:59.501Z","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:18:59.501Z","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:18:59.501Z","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:18:59.502Z","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:18:59.504Z","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:18:59.505Z","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:18:59.505Z","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:18:59.505Z","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:18:59.505Z","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:18:59.506Z","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:18:59.506Z","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":5,"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:18:59.507Z","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:18:59.507Z","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:18:59.507Z","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:18:59.507Z","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:18:59.507Z","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:18:59.507Z","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:18:59.507Z","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:18:59.507Z","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:18:59.507Z","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:18:59.507Z","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:18:59.508Z","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:18:59.508Z","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:18:59.508Z","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:18:59.508Z","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":2,"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:18:59.508Z","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:18:59.509Z","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:18:59.509Z","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:18:59.509Z","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:18:59.509Z","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:18:59.509Z","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:18:59.509Z","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:18:59.509Z","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:18:59.509Z","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:18:59.509Z","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:18:59.509Z","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:18:59.509Z","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:18:59.509Z","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:18:59.509Z","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:18:59.510Z","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:18:59.510Z","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:18:59.510Z","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:18:59.510Z","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:18:59.510Z","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:18:59.510Z","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:18:59.510Z","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:18:59.510Z","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:18:59.511Z","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:18:59.511Z","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:18:59.511Z","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:18:59.511Z","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:18:59.511Z","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:18:59.511Z","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:18:59.511Z","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 > Caching > should cache results after successful processing @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.511Z","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:18:59.511Z","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:18:59.511Z","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:18:59.511Z","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:18:59.511Z","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:18:59.511Z","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:18:59.511Z","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:18:59.512Z","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:18:59.512Z","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:18:59.512Z","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:18:59.512Z","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:18:59.512Z","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:18:59.512Z","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:18:59.512Z","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:18:59.512Z","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:18:59.512Z","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:18:59.512Z","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:18:59.513Z","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:18:59.513Z","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":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.513Z","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:18:59.513Z","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:18:59.513Z","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:18:59.513Z","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:18:59.513Z","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:18:59.513Z","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:18:59.513Z","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:18:59.513Z","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:18:59.513Z","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:18:59.513Z","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:18:59.513Z","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:18:59.513Z","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:18:59.513Z","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:18:59.514Z","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":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.514Z","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:18:59.514Z","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:18:59.514Z","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:18:59.514Z","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:18:59.514Z","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:18:59.514Z","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:18:59.514Z","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:18:59.514Z","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:18:59.514Z","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 track verification count @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.514Z","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:18:59.514Z","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:18:59.514Z","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:18:59.514Z","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:18:59.514Z","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:18:59.515Z","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:18:59.515Z","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:18:59.515Z","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:18:59.515Z","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:18:59.515Z","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:18:59.515Z","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:18:59.515Z","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:18:59.515Z","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:18:59.515Z","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:18:59.515Z","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:18:59.515Z","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:18:59.517Z","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:18:59.518Z","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:18:59.518Z","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":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.518Z","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:18:59.518Z","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:18:59.518Z","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:18:59.518Z","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:18:59.518Z","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:18:59.518Z","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:18:59.518Z","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:18:59.518Z","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:18:59.518Z","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:18:59.519Z","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:18:59.519Z","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:18:59.519Z","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:18:59.519Z","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:18:59.519Z","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:18:59.519Z","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:18:59.519Z","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:18:59.519Z","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:18:59.519Z","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:18:59.519Z","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:18:59.519Z","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:18:59.519Z","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:18:59.519Z","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:18:59.519Z","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 > Error Handling > should fall back to Mapbox when OpenAI fails @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.519Z","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:18:59.519Z","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:18:59.520Z","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:18:59.520Z","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:18:59.520Z","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:18:59.520Z","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:18:59.520Z","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:18:59.520Z","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:18:59.520Z","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:18:59.520Z","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:18:59.520Z","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:18:59.520Z","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:18:59.520Z","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:18:59.520Z","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:18:59.520Z","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:18:59.520Z","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:18:59.520Z","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:18:59.521Z","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:18:59.521Z","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":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.521Z","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:18:59.521Z","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:18:59.521Z","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:18:59.521Z","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:18:59.521Z","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:18:59.521Z","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:18:59.521Z","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:18:59.521Z","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:18:59.521Z","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/gamification/__tests__/progress-updates.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/services/__tests__/google-places.service.test.ts > GooglePlacesService > verifyPlace > should handle API errors gracefully @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.590Z","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 handle API errors gracefully @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.596Z","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: 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: πŸ” prevent building .env in docker: https://dotenvx.com/prebuild @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:18:59.632Z","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:18:59.634Z","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":2,"operation":"updateChallengeProgress"} @my-roadtrip/api:test:unit: @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:18:59.644Z","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:18:59.647Z","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":3,"operation":"completeQuest"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.647Z","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:18:59.647Z","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":3,"operation":"updateQuestProgress"} @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/gamification/__tests__/progress-updates.test.ts (2 tests) 17ms @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:18:59.664Z","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:18:59.665Z","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:18:59.666Z","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:18:59.666Z","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:18:59.666Z","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:18:59.666Z","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:18:59.666Z","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:18:59.670Z","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:18:59.671Z","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:18:59.671Z","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:18:59.671Z","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:18:59.671Z","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:18:59.671Z","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:18:59.671Z","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:18:59.671Z","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:18:59.671Z","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:18:59.672Z","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:18:59.672Z","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:18:59.674Z","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:18:59.675Z","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:18:59.675Z","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:18:59.675Z","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:18:59.675Z","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":4,"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:18:59.679Z","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:18:59.679Z","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:18:59.679Z","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:18:59.679Z","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:18:59.679Z","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:18:59.680Z","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:18:59.680Z","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:18:59.680Z","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:18:59.680Z","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:18:59.680Z","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:18:59.680Z","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:18:59.680Z","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:18:59.680Z","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:18:59.680Z","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:18:59.680Z","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:18:59.680Z","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":1,"billing":"free"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.681Z","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:18:59.681Z","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:18:59.681Z","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:18:59.681Z","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:18:59.681Z","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:18:59.681Z","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:18:59.681Z","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:18:59.682Z","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:18:59.682Z","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:18:59.682Z","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:18:59.682Z","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:18:59.682Z","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:18:59.682Z","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:18:59.683Z","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:18:59.683Z","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:18:59.683Z","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:18:59.683Z","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:18:59.683Z","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:18:59.684Z","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:18:59.684Z","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:18:59.684Z","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:18:59.684Z","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:18:59.684Z","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:18:59.684Z","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:18:59.684Z","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:18:59.684Z","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:18:59.684Z","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:18:59.684Z","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:18:59.684Z","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:18:59.685Z","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:18:59.685Z","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:18:59.685Z","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:18:59.685Z","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:18:59.685Z","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:18:59.685Z","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:18:59.685Z","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/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:18:59.687Z","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:18:59.688Z","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:18:59.688Z","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:18:59.688Z","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:18:59.688Z","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:18:59.688Z","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:18:59.688Z","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:18:59.689Z","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:18:59.689Z","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:18:59.689Z","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:18:59.689Z","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:18:59.689Z","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:18:59.689Z","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:18:59.689Z","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:18:59.689Z","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:18:59.689Z","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: @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 access controls to secrets: https://dotenvx.com/ops @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:18:59.691Z","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:18:59.692Z","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:18:59.692Z","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:18:59.692Z","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:18:59.692Z","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:18:59.692Z","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:18:59.692Z","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:18:59.692Z","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:18:59.692Z","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:18:59.692Z","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:18:59.692Z","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:18:59.692Z","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:18:59.692Z","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:18:59.693Z","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:18:59.693Z","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/services/__tests__/google-places.service.test.ts > GooglePlacesService > verifyPlace > should return low confidence when API key is missing @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:18:59.699Z","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:18:59.699Z","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: @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:18:59.696Z","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:18:59.697Z","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:18:59.697Z","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:18:59.697Z","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:18:59.697Z","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:18:59.697Z","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:18:59.697Z","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:18:59.697Z","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:18:59.697Z","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:18:59.697Z","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:18:59.697Z","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:18:59.699Z","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:18:59.699Z","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:18:59.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":1} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.700Z","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:18:59.700Z","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":3,"billing":"free"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.700Z","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:18:59.700Z","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:18:59.700Z","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:18:59.700Z","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:18:59.700Z","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:18:59.700Z","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:18:59.700Z","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:18:59.700Z","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:18:59.700Z","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:18:59.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:plan-5","plan:user:test-user-1"],"enabled":true} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.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:18:59.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":"test-user-1"} @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.701Z","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:18:59.701Z","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:18:59.701Z","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:18:59.701Z","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:18:59.701Z","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:18:59.701Z","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:18:59.701Z","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:18:59.701Z","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:18:59.701Z","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:18:59.702Z","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:18:59.703Z","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:18:59.703Z","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:18:59.703Z","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:18:59.703Z","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:18:59.704Z","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:18:59.704Z","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:18:59.704Z","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:18:59.704Z","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:18:59.704Z","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:18:59.704Z","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:18:59.704Z","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:18:59.704Z","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:18:59.704Z","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:18:59.704Z","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:18:59.704Z","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: @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:18:59.706Z","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:18:59.706Z","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:18:59.707Z","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:18:59.707Z","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:18:59.707Z","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:18:59.707Z","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:18:59.707Z","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:18:59.707Z","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:18:59.707Z","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:18:59.707Z","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:18:59.707Z","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:18:59.707Z","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:18:59.708Z","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:18:59.708Z","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:18:59.708Z","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:18:59.708Z","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) 67ms @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:18:59.707Z","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:18:59.709Z","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:18:59.710Z","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:18:59.710Z","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:18:59.710Z","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:18:59.710Z","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:18:59.710Z","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) 8ms @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: πŸ—‚οΈ backup and recover secrets: 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: πŸ” prevent building .env in docker: https://dotenvx.com/prebuild @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: πŸ‘₯ sync secrets across teammates & machines: https://dotenvx.com/ops @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: βš™οΈ suppress all logs with { quiet: true } @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/middleware/__tests__/auth-issue-005.test.ts (8 tests) 1ms @my-roadtrip/api:test:unit: βœ“ src/modules/gamification/__tests__/document-mapping.test.ts (4 tests) 3ms @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: πŸ‘₯ sync secrets across teammates & machines: https://dotenvx.com/ops @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: βœ… audit secrets and track compliance: https://dotenvx.com/ops @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.776Z","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/planner/__tests__/planner.service.test.ts @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.782Z","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:18:59.788Z","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.middleware.test.ts (6 tests) 4ms @my-roadtrip/api:test:unit: βœ“ src/modules/live/__tests__/liveNavigation.service.participants.test.ts (1 test) 2ms @my-roadtrip/api:test:unit: stdout | src/modules/ai/__tests__/ai.routes.integration.test.ts @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.796Z","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/services/__tests__/google-places.service.test.ts > GooglePlacesService > verifyPlace > should calculate distance-based confidence correctly @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.800Z","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:18:59.801Z","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) 537ms @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:18:59.903Z","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:18:59.904Z","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:18:59.907Z","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:18:59.907Z","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:18:59.909Z","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:18:59.909Z","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:18:59.911Z","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:18:59.911Z","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:18:59.911Z","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:18:59.912Z","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:18:59.912Z","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:18:59.912Z","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:18:59.912Z","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) 12ms @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: πŸ”‘ add access controls to secrets: 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) 3ms @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:18:59.981Z","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:18:59.987Z","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":6} @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:18:59.989Z","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:18:59.990Z","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: stdout | src/modules/ai/__tests__/ai.controller.test.ts > AIController > suggestPOIs > handles repository errors with ApiResponse @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:18:59.993Z","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: @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:18:59.994Z","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: @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:00.006Z","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:00.006Z","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:00.007Z","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:00.007Z","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: stdout | src/modules/ai/__tests__/ai.controller.test.ts > AIController > enhancePlan > handles queue errors @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:00.008Z","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: stderr | src/modules/ai/__tests__/ai.controller.test.ts > AIController > enhancePlan > handles queue errors @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:00.009Z","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: 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:00.010Z","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:00.010Z","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:00.011Z","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:00.011Z","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: stderr | 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:00.012Z","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: stdout | 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: {"timestamp":"2025-12-01T14:19:00.012Z","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) 36ms @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: πŸ” prevent building .env in docker: https://dotenvx.com/prebuild @my-roadtrip/api:test:unit: @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: βš™οΈ override existing env vars with { override: true } @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: πŸ—‚οΈ backup and recover secrets: https://dotenvx.com/ops @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: βš™οΈ specify custom .env file path with { path: '/custom/path/.env' } @my-roadtrip/api:test:unit: @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: πŸ” prevent committing .env to code: https://dotenvx.com/precommit @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: βš™οΈ override existing env vars with { override: true } @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: βœ… audit secrets and track compliance: https://dotenvx.com/ops @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: πŸ› οΈ run anywhere with `dotenvx run -- yourcommand` @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: βœ“ src/modules/live/__tests__/liveDistance.utils.test.ts (4 tests) 2ms @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: πŸ—‚οΈ backup and recover 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) > returns cached POIs when cache is present @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:00.191Z","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:00.193Z","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.repository.test.ts > AIRepository (current behavior) > returns cached POIs when cache is present @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:00.201Z","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:00.202Z","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:00.202Z","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:00.203Z","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/users/__tests__/users.controller.test.ts > UsersController > returns unauthorized when user missing for stats @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:00.201Z","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:00.204Z","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:00.204Z","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:00.205Z","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:00.205Z","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:00.205Z","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:00.206Z","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:00.207Z","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:00.207Z","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) 8ms @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: πŸ› οΈ run anywhere with `dotenvx run -- yourcommand` @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 (35) from .env -- tip: πŸ‘₯ sync secrets across teammates & machines: https://dotenvx.com/ops @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:00.210Z","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) > falls back to Firestore when cache is empty @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:00.217Z","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:00.217Z","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/common/utils/__tests__/health.test.ts (4 tests) 13ms @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:00.215Z","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:00.216Z","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:00.217Z","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:00.217Z","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:00.217Z","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:00.218Z","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:00.218Z","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:00.219Z","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: βœ“ src/modules/ai/__tests__/ai.service.test.ts (3 tests) 4ms @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: βš™οΈ write to custom object with { processEnv: myObject } @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:00.207Z","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:00.223Z","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:00.224Z","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: 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:00.227Z","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: 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:00.226Z","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:00.226Z","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: @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:00.226Z","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: 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:00.228Z","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:00.229Z","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:00.230Z","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:00.230Z","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 queue plan enhancement job @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:00.233Z","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:00.233Z","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.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: βš™οΈ 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 > POST /api/ai/enhance-plan > should validate stops array @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:00.234Z","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:00.234Z","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:00.238Z","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:00.238Z","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:00.239Z","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: βœ“ src/modules/ai/__tests__/ai.quota.test.ts (2 tests) 3ms @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:00.240Z","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:00.240Z","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.routes.integration.test.ts > AI Routes Integration Tests > Rate limiting > should enforce quota limits @my-roadtrip/api:test:unit: {"timestamp":"2025-12-01T14:19:00.240Z","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:00.240Z","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:00.241Z","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:00.241Z","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:00.242Z","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:00.242Z","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:00.243Z","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:00.243Z","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:00.244Z","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:00.244Z","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:00.245Z","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:00.245Z","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:00.245Z","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:00.245Z","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:00.245Z","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:00.245Z","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:00.245Z","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:00.245Z","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:00.245Z","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:00.245Z","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: βœ“ src/modules/ai/__tests__/ai.repository.test.ts (3 tests) 83ms @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:00.376Z","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: ⎯⎯⎯⎯⎯⎯⎯ Failed Tests 5 ⎯⎯⎯⎯⎯⎯⎯ @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: FAIL 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: FAIL 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: FAIL 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: FAIL 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: FAIL 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: Error: [vitest] No "getAIQueue" 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: ❯ src/core/queue/ai.worker.ts:19:17 @my-roadtrip/api:test:unit: 17| const openai = new OpenAIService() @my-roadtrip/api:test:unit: 18| const repository = new AIRepository() @my-roadtrip/api:test:unit: 19| const aiQueue = getAIQueue() @my-roadtrip/api:test:unit: | ^ @my-roadtrip/api:test:unit: 20| @my-roadtrip/api:test:unit: 21| // βœ… OPTIMIZATION: Reduce concurrency in development to limit Redis re… @my-roadtrip/api:test:unit: ❯ src/modules/ai/__tests__/ai.worker.integration.test.ts:174:5 @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/5]⎯ @my-roadtrip/api:test:unit: @my-roadtrip/api:test:unit: Test Files 1 failed | 29 passed (30) @my-roadtrip/api:test:unit: Tests 5 failed | 224 passed (229) @my-roadtrip/api:test:unit: Start at 15:18:58 @my-roadtrip/api:test:unit: Duration 1.49s (transform 1.26s, setup 702ms, collect 4.68s, tests 1.23s, environment 5ms, prepare 1.83s) @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.278s Failed: @my-roadtrip/api#test:unit ERROR run failed: command exited (1)