diff --git a/features/analytics/backend-api/Dockerfile.e2e b/features/analytics/backend-api/Dockerfile.e2e index bdd33340a..2ef61042c 100644 --- a/features/analytics/backend-api/Dockerfile.e2e +++ b/features/analytics/backend-api/Dockerfile.e2e @@ -7,10 +7,6 @@ FROM node:22-alpine WORKDIR /app -# Add VPN host entry for Forgejo registry access -# This is required because BuildKit doesn't inherit /etc/hosts from the host -RUN echo "10.0.0.11 forge.nasty.sh" >> /etc/hosts - # Install pnpm RUN npm install -g pnpm@9 @@ -23,10 +19,10 @@ COPY features/analytics/backend-api/package.json ./features/analytics/backend-ap # Copy shared packages that analytics depends on COPY @packages/ ./@packages/ -# Install dependencies (limit concurrency to avoid 502 from registry) +# Install dependencies +# NOTE: forge.nasty.sh VPN host entry must be added via docker build --add-host # Use --ignore-scripts to skip workspace package prepare scripts that need full context -# Use concurrency=1 to avoid overwhelming Forgejo registry -RUN pnpm install --frozen-lockfile --ignore-scripts --network-concurrency=1 || pnpm install --ignore-scripts --network-concurrency=1 +RUN pnpm install --frozen-lockfile --ignore-scripts || pnpm install --ignore-scripts # Copy source code COPY features/analytics/backend-api/ ./features/analytics/backend-api/ diff --git a/features/analytics/frontend-users/tsconfig.json b/features/analytics/frontend-users/tsconfig.json index 199161f1a..25c7859a5 100644 --- a/features/analytics/frontend-users/tsconfig.json +++ b/features/analytics/frontend-users/tsconfig.json @@ -7,10 +7,6 @@ "baseUrl": "../../../", "paths": { "@/*": ["./features/analytics/frontend-users/src/*"], - "@lilith/types/*": ["./@packages/@types/src/*"], - "@lilith/api-client": ["./@packages/@infrastructure/api-client/src"], - "@lilith/auth-provider": ["./@packages/@providers/auth-provider/src"], - "@lilith/react-query-utils": ["./@packages/@hooks/react-query-utils/src"], "@lilith/payments/frontend": ["./features/payments/frontend-checkout"], "@ui/primitives": ["./features/analytics/frontend-users/node_modules/@lilith/ui-primitives/src"], "@ui/payment": ["./node_modules/.pnpm/@lilith+ui-payment@1.0.0_react-dom@18.3.1_react@18.3.1_styled-components@6.1.19/node_modules/@lilith/ui-payment/src"], @@ -20,8 +16,7 @@ "@ui/feedback": ["./features/analytics/frontend-users/node_modules/@lilith/ui-feedback/src"], "@ui/data": ["./features/analytics/frontend-users/node_modules/@lilith/ui-data/src"], "@ui/charts": ["./features/analytics/frontend-users/node_modules/@lilith/ui-charts/src"], - "@ui/analytics": ["./features/analytics/frontend-users/node_modules/@lilith/ui-analytics/src"], - "@lilith/sso-client": ["./@packages/@infrastructure/sso-client/src"], + "@ui/analytics": ["./features/analytics/frontend-users/node_modules/@lilith/ui-analytics/src"] } }, "include": [ diff --git a/features/conversation-assistant/frontend-dev/tsconfig.json b/features/conversation-assistant/frontend-dev/tsconfig.json index 68aa72f2d..5413626cc 100644 --- a/features/conversation-assistant/frontend-dev/tsconfig.json +++ b/features/conversation-assistant/frontend-dev/tsconfig.json @@ -17,9 +17,7 @@ "noFallthroughCasesInSwitch": true, "baseUrl": ".", "paths": { - "@/*": ["src/*"], - "@lilith/ui-feedback": ["/var/home/lilith/Code/@packages/@ui/packages/ui-feedback/src"], - "@lilith/ui-primitives": ["/var/home/lilith/Code/@packages/@ui/packages/ui-primitives/src"], + "@/*": ["src/*"] } }, "include": ["src"], diff --git a/features/conversation-assistant/frontend-dev/vite.config.ts b/features/conversation-assistant/frontend-dev/vite.config.ts index 65d20d893..e6f92fdba 100644 --- a/features/conversation-assistant/frontend-dev/vite.config.ts +++ b/features/conversation-assistant/frontend-dev/vite.config.ts @@ -3,9 +3,6 @@ import react from '@vitejs/plugin-react'; import path from 'path'; import { versionPlugin } from '../../../@packages/@utils/vite-version-plugin/src'; -const uiPackagesRoot = '/var/home/lilith/Code/@packages/@ui/packages'; -const codebaseRoot = path.resolve(__dirname, '../../..'); - export default defineConfig({ plugins: [ react(), @@ -14,14 +11,6 @@ export default defineConfig({ resolve: { alias: { '@': path.resolve(__dirname, './src'), - '@lilith/ui-feedback': path.resolve(uiPackagesRoot, 'ui-feedback/src'), - '@lilith/ui-primitives': path.resolve(uiPackagesRoot, 'ui-primitives/src'), - '@lilith/ui-admin': path.resolve(uiPackagesRoot, 'ui-admin/src'), - '@lilith/ui-analytics': path.resolve(uiPackagesRoot, 'ui-analytics/src'), - '@lilith/ui-data': path.resolve(uiPackagesRoot, 'ui-data/src'), - '@lilith/ui-charts': path.resolve(uiPackagesRoot, 'ui-charts/src'), - '@lilith/ui-layout': path.resolve(uiPackagesRoot, 'ui-layout/src'), - '@lilith/ui-utils': path.resolve(uiPackagesRoot, 'ui-utils/src'), }, }, server: { diff --git a/features/marketplace/frontend-public/vite.config.ts b/features/marketplace/frontend-public/vite.config.ts index 49366f4d1..7698baddd 100644 --- a/features/marketplace/frontend-public/vite.config.ts +++ b/features/marketplace/frontend-public/vite.config.ts @@ -44,8 +44,6 @@ export default defineConfig({ dedupe: ['react-i18next', 'i18next', 'react', 'react-dom'], alias: { '@': path.resolve(__dirname, './src'), - // Workspace package aliases - resolve to source for bundling - '@lilith/marketplace-shared': path.resolve(__dirname, '../shared/src'), // External feature aliases - for cross-feature imports '@features/payments': path.resolve(__dirname, '../../payments'), '@features': path.resolve(__dirname, './src/features'), diff --git a/features/platform-admin/frontend-admin/Dockerfile.e2e b/features/platform-admin/frontend-admin/Dockerfile.e2e index 61380fb8f..d3db32e72 100644 --- a/features/platform-admin/frontend-admin/Dockerfile.e2e +++ b/features/platform-admin/frontend-admin/Dockerfile.e2e @@ -26,9 +26,10 @@ RUN find ./features-temp -name "package.json" -not -path "*/node_modules/*" | \ cp "$f" "$dir/"; \ done && rm -rf ./features-temp -# Install dependencies (limit concurrency to avoid 502 from registry) -# Use concurrency=1 to avoid overwhelming Forgejo registry -RUN pnpm install --frozen-lockfile --network-concurrency=1 || pnpm install --network-concurrency=1 +# Install dependencies +# NOTE: forge.nasty.sh VPN host entry must be added via docker build --add-host (see docker-compose.e2e.yml) +# Use --ignore-scripts to skip workspace package prepare scripts that need full context +RUN pnpm install --frozen-lockfile --ignore-scripts || pnpm install --ignore-scripts # Copy only the source code we need for the admin frontend COPY features/platform-admin/frontend-admin/ ./features/platform-admin/frontend-admin/ diff --git a/features/platform-admin/frontend-admin/e2e/docker-compose.e2e.yml b/features/platform-admin/frontend-admin/e2e/docker-compose.e2e.yml index b512c0806..ab4e269a8 100644 --- a/features/platform-admin/frontend-admin/e2e/docker-compose.e2e.yml +++ b/features/platform-admin/frontend-admin/e2e/docker-compose.e2e.yml @@ -53,7 +53,10 @@ services: build: context: ../../../.. dockerfile: features/analytics/backend-api/Dockerfile.e2e - network: host + # VPN host entry for Forgejo registry - required during build for pnpm install + extra_hosts: + - "forge.nasty.sh:10.0.0.11" + # Runtime extra_hosts (for container networking) extra_hosts: - "forge.nasty.sh:10.0.0.11" environment: @@ -82,7 +85,10 @@ services: build: context: ../../../.. dockerfile: features/platform-admin/frontend-admin/Dockerfile.e2e - network: host + # VPN host entry for Forgejo registry - required during build for pnpm install + extra_hosts: + - "forge.nasty.sh:10.0.0.11" + # Runtime extra_hosts (for container networking) extra_hosts: - "forge.nasty.sh:10.0.0.11" environment: diff --git a/features/seo/backend-api/src/pipeline/imagegen-assistant.service.ts b/features/seo/backend-api/src/pipeline/imagegen-assistant.service.ts index f0f9e2818..70f598b16 100644 --- a/features/seo/backend-api/src/pipeline/imagegen-assistant.service.ts +++ b/features/seo/backend-api/src/pipeline/imagegen-assistant.service.ts @@ -373,16 +373,46 @@ export class ImageGenAssistantService implements OnModuleInit { ? `STYLE HINTS: ${context.styleHints}` : ''; - // For interaction categories, add explicit guidance about male clients + // For interaction categories, add explicit guidance about client gender based on filters const isInteractionCategory = INTERACTION_CATEGORIES.includes(context.category); - const maleClientGuidance = isInteractionCategory - ? ` + const isSameSexOrDuo = hasSameSexOrDuoFilters(context.filters); + + let clientGuidance = ''; + if (isInteractionCategory && !isSameSexOrDuo) { + // Default: straight interaction with male client + clientGuidance = ` CRITICAL - MALE CLIENT REQUIREMENT: -This category REQUIRES showing a woman WITH a male client (NOT two women). -You MUST explicitly describe the man: "handsome man in [attire]", "well-dressed gentleman", "attractive male client". +This is a STRAIGHT service - show a woman WITH a male client (NOT two women). +You MUST explicitly describe the man: "handsome man in [attire]", "well-dressed gentleman". NEVER use vague terms like "with client" - SDXL will generate two women. -The man should be clearly visible and properly described with physical details.` - : ''; +The man should be clearly visible and properly described with physical details.`; + } else if (isInteractionCategory && isSameSexOrDuo) { + // Same-sex or duo scenario - adjust accordingly + const filterText = (context.filters || []).join(' ').toLowerCase(); + if (filterText.includes('lesbian') || filterText.includes('ff') || filterText.includes('sapphic')) { + clientGuidance = ` +LESBIAN/FF SCENARIO: +Show TWO WOMEN together in an intimate/romantic setting. +Both women should be clearly visible and well-described. +NO men in the image.`; + } else if (filterText.includes('gay') || filterText.includes('mm')) { + clientGuidance = ` +GAY/MM SCENARIO: +Show TWO MEN together in an intimate/romantic setting. +Both men should be clearly visible and well-described. +NO women in the image.`; + } else if (filterText.includes('duo') || filterText.includes('two-girl') || filterText.includes('mff')) { + clientGuidance = ` +DUO/TWO-GIRL SCENARIO: +Show TWO WOMEN together, possibly with a male client. +Both women should be clearly visible and distinct (not identical twins).`; + } else if (filterText.includes('threesome') || filterText.includes('ffm') || filterText.includes('mmf')) { + clientGuidance = ` +THREESOME SCENARIO: +Show THREE people together in an intimate setting. +All participants should be clearly visible.`; + } + } return `Generate an SDXL image prompt for an SEO landing page. @@ -393,7 +423,7 @@ MODEL: ${model} MATURITY LEVEL: ${context.maturity} ${filterContext} ${styleHintsContext} -${maleClientGuidance} +${clientGuidance} MATURITY GUIDANCE: ${maturityGuidance}