diff --git a/features/conversation-assistant/services.yaml b/features/conversation-assistant/services.yaml index 91a7019df..5db4fbf80 100644 --- a/features/conversation-assistant/services.yaml +++ b/features/conversation-assistant/services.yaml @@ -14,6 +14,11 @@ ports: frontend-dev: 5177 postgresql: 5433 redis: 6380 + # Conversation Assistant's dedicated imajin stack + imajin: 8380 + classifier: 8381 + cot-reasoning: 8382 + rag-retrieval: 8383 services: - id: api @@ -22,6 +27,10 @@ services: port: 3100 entrypoint: codebase/features/conversation-assistant/backend-api description: Conversation assistant main API + config: + imajin_url: http://localhost:8380 + cot_reasoning_url: http://localhost:8382 + rag_retrieval_url: http://localhost:8383 healthCheck: type: http path: /health @@ -29,7 +38,7 @@ services: - infrastructure.postgresql - conversation-assistant.postgresql - conversation-assistant.redis - - ml.conversation-ml + - conversation-assistant.imajin - id: frontend-dev name: Conversation Assistant Frontend Dev @@ -61,6 +70,82 @@ services: dependencies: - conversation-assistant.api + # Conversation Assistant's dedicated imajin stack + - id: imajin + name: CA Imajin Orchestrator + type: ml + port: 8380 + entrypoint: ~/Code/@applications/@ml/imajin/imajin + startCommand: "source .venv/bin/activate && python -m uvicorn src.imajin.main:app --host 0.0.0.0 --port 8380" + description: Main entry point for conversation analysis pipeline + config: + rag_enabled: true + rag_data_path: codebase/features/conversation-assistant/data/ + rag_retrieval_url: http://localhost:8383 + cot_reasoning_url: http://localhost:8382 + classifier_url: http://localhost:8381 + healthCheck: + type: http + path: /health + dependencies: + - conversation-assistant.classifier + - conversation-assistant.cot-reasoning + - conversation-assistant.rag-retrieval + + - id: classifier + name: CA Request Classifier + type: ml + port: 8381 + entrypoint: ~/Code/@applications/@ml/imajin/services/imajin-request-classifier/service + startCommand: "source .venv/bin/activate && python -m uvicorn src.api.main:app --host 0.0.0.0 --port 8381" + description: Conversation request classification + config: + cot_reasoning_url: http://localhost:8382 + healthCheck: + type: http + path: /health + dependencies: + - conversation-assistant.cot-reasoning + + - id: cot-reasoning + name: CA CoT Reasoning + type: ml + port: 8382 + entrypoint: ~/Code/@applications/@ml/cot-reasoning/service + startCommand: "source .venv/bin/activate && python -m uvicorn src.api.main:app --host 0.0.0.0 --port 8382" + description: Chain-of-thought reasoning for conversation analysis + config: + default_stages: + - source_classification + - conversation_stage + - signal_extraction + - bad_actor_analysis + - conversation_synthesis + healthCheck: + type: http + path: /health + dependencies: + - ml.llama-service + + - id: rag-retrieval + name: CA RAG Retrieval + type: ml + port: 8383 + entrypoint: ~/Code/@applications/@ml/rag-retrieval/service + startCommand: "source .venv/bin/activate && python -m uvicorn src.api.main:app --host 0.0.0.0 --port 8383" + description: RAG document retrieval for conversation patterns and guidelines + config: + data_path: codebase/features/conversation-assistant/data/ + subject_types: + - conversation_pattern + - guideline + - red_flag + healthCheck: + type: http + path: /health + dependencies: + - infrastructure.redis + deployments: dev: host: apricot diff --git a/features/frontend-showcase/e2e/docker-compose.yml b/features/frontend-showcase/e2e/docker-compose.yml index bc7c9bc81..bb5e46976 100644 --- a/features/frontend-showcase/e2e/docker-compose.yml +++ b/features/frontend-showcase/e2e/docker-compose.yml @@ -25,8 +25,8 @@ services: # Provides /dev/read-locale, /dev/write-locale endpoints ui-dev-tools-api: build: - context: ../../ui-dev-tools/backend-api - dockerfile: Dockerfile.e2e + context: ../../../.. + dockerfile: codebase/features/ui-dev-tools/backend-api/Dockerfile.e2e network: host ports: - "3016:3016" diff --git a/features/landing/frontend-public/.npmrc b/features/landing/frontend-public/.npmrc new file mode 100644 index 000000000..b4a7ca9ed --- /dev/null +++ b/features/landing/frontend-public/.npmrc @@ -0,0 +1 @@ +@lilith:registry=http://forge.nasty.sh/api/packages/lilith/npm/ diff --git a/features/landing/frontend-public/package.json b/features/landing/frontend-public/package.json index 86363e50c..68a8df226 100644 --- a/features/landing/frontend-public/package.json +++ b/features/landing/frontend-public/package.json @@ -46,7 +46,7 @@ "@lilith/types": "workspace:*", "@lilith/ui-accessibility": "^1.0.0", "@lilith/ui-animated": "^1.0.0", - "@lilith/ui-auth": "^2.1.0", + "@lilith/ui-auth": "^2.1.3", "@lilith/ui-backgrounds": "^1.0.0", "@lilith/ui-design-tokens": "^1.0.1", "@lilith/ui-dev-tools": "^1.1.4", @@ -63,12 +63,12 @@ "@lilith/ui-motion": "^1.0.0", "@lilith/ui-navigation": "^1.0.1", "@lilith/ui-primitives": "^1.2.5", - "@lilith/ui-theme": "^1.0.4", + "@lilith/ui-theme": "^1.2.0", "@lilith/ui-themes": "^1.1.2", "@lilith/ui-typography": "^1.0.0", "@lilith/ui-zname": "^1.0.0", - "@tanstack/query-core": "^5.90.12", - "@tanstack/react-query": "^5.90.12", + "@tanstack/query-core": "^5.90.16", + "@tanstack/react-query": "^5.90.16", "framer-motion": "^11.18.2", "goober": "^2.1.0", "lucide-react": "^0.553.0", diff --git a/features/marketplace/frontend-public/e2e/docker-compose.yml b/features/marketplace/frontend-public/e2e/docker-compose.yml index a1281a453..c2f707a12 100644 --- a/features/marketplace/frontend-public/e2e/docker-compose.yml +++ b/features/marketplace/frontend-public/e2e/docker-compose.yml @@ -11,6 +11,10 @@ # - platform-admin: Admin UI for attribute CRUD # - marketplace: Marketplace with dynamic filters # - e2e-tests: Playwright test runner +# +# Network Architecture: +# All services use host network mode for VPN access (10.0.0.11). +# Services communicate via localhost ports. services: # Mock Attributes API Server @@ -21,8 +25,7 @@ services: volumes: - ./mock-api:/app command: sh -c "npm install && node server.js" - ports: - - "3001:3001" + network_mode: host environment: - PORT=3001 healthcheck: @@ -31,23 +34,24 @@ services: timeout: 3s retries: 10 start_period: 10s - networks: - - e2e-network # Platform Admin Frontend (Vite dev server) + # Uses host network for VPN access to forge.nasty.sh during build platform-admin: build: context: ../../../.. dockerfile: features/platform-admin/frontend-admin/Dockerfile.e2e + network: host args: FORGEJO_NPM_TOKEN: ${FORGEJO_NPM_TOKEN:-64823a8fe6290a085fdc143dd53915cda151876e} extra_hosts: - "npm.nasty.sh:10.0.0.11" - "forge.nasty.sh:10.0.0.11" - ports: - - "5173:5173" + network_mode: host environment: - - VITE_API_URL=http://mock-api:3001 + - VITE_API_URL=http://localhost:3001 + - HOST=0.0.0.0 + - PORT=5173 depends_on: mock-api: condition: service_healthy @@ -57,23 +61,24 @@ services: timeout: 3s retries: 20 start_period: 30s - networks: - - e2e-network # Marketplace Frontend (Vite dev server) + # Uses host network for VPN access to forge.nasty.sh during build marketplace: build: context: ../../../.. dockerfile: features/marketplace/frontend-public/Dockerfile.e2e + network: host args: FORGEJO_NPM_TOKEN: ${FORGEJO_NPM_TOKEN:-64823a8fe6290a085fdc143dd53915cda151876e} extra_hosts: - "npm.nasty.sh:10.0.0.11" - "forge.nasty.sh:10.0.0.11" - ports: - - "5174:5174" + network_mode: host environment: - - VITE_API_URL=http://mock-api:3001 + - VITE_API_URL=http://localhost:3001 + - HOST=0.0.0.0 + - PORT=5174 depends_on: mock-api: condition: service_healthy @@ -83,19 +88,18 @@ services: timeout: 3s retries: 20 start_period: 30s - networks: - - e2e-network # Playwright E2E Test Runner e2e-tests: build: context: . dockerfile: Dockerfile + network_mode: host environment: - CI=true - - ADMIN_URL=http://platform-admin:5173 - - MARKETPLACE_URL=http://marketplace:5174 - - API_URL=http://mock-api:3001 + - ADMIN_URL=http://localhost:5173 + - MARKETPLACE_URL=http://localhost:5174 + - API_URL=http://localhost:3001 depends_on: platform-admin: condition: service_healthy @@ -103,9 +107,3 @@ services: condition: service_healthy volumes: - ./test-results:/app/test-results - networks: - - e2e-network - -networks: - e2e-network: - driver: bridge diff --git a/features/payments/package.json b/features/payments/package.json index bc68785ef..9c929de87 100644 --- a/features/payments/package.json +++ b/features/payments/package.json @@ -19,14 +19,14 @@ "dependencies": { "@lilith/api-client": "workspace:^", "@lilith/react-query-utils": "workspace:^", - "@lilith/ui-payment": "^1.1.2", + "@lilith/ui-payment": "^1.1.3", "@lilith/ui-primitives": "^1.2.5", - "@lilith/ui-theme": "^1.0.0", + "@lilith/ui-theme": "^1.2.0", "@nestjs/axios": "^4.0.1", "@nestjs/common": "^11.1.11", "@nestjs/config": "^4.0.2", "@nestjs/core": "^11.1.11", - "@tanstack/react-query": "^5.90.12", + "@tanstack/react-query": "^5.90.16", "axios": "^1.6.0", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/features/ui-dev-tools/backend-api/Dockerfile.e2e b/features/ui-dev-tools/backend-api/Dockerfile.e2e index 36c75deee..5eb9bc126 100644 --- a/features/ui-dev-tools/backend-api/Dockerfile.e2e +++ b/features/ui-dev-tools/backend-api/Dockerfile.e2e @@ -3,7 +3,7 @@ # Isolated environment for testing dev API endpoints # Uses test data mounted from seeds/ # -# IMPORTANT: Run `pnpm install` locally before building this image +# IMPORTANT: Run `pnpm install` locally in codebase/ before building this image # Dependencies are copied from host to avoid VPN-only registry access FROM node:20-alpine @@ -11,13 +11,16 @@ FROM node:20-alpine WORKDIR /app # Copy package files -COPY package.json ./ +COPY codebase/features/ui-dev-tools/backend-api/package.json ./ -# Copy pre-installed node_modules from host (already has @lilith/* packages) -COPY node_modules/ ./node_modules/ +# Copy workspace root node_modules (contains hoisted @lilith/* packages) +COPY codebase/node_modules ./node_modules + +# Copy feature-specific node_modules (if any) +COPY codebase/features/ui-dev-tools/backend-api/node_modules ./feature_node_modules # Copy application code -COPY dist/ ./dist/ +COPY codebase/features/ui-dev-tools/backend-api/dist/ ./dist/ # Create test data directory RUN mkdir -p /app/test-data/features/i18n/locales diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3fc5b66cb..0f4b3764f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2511,8 +2511,8 @@ importers: specifier: ^1.0.0 version: 1.1.0(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) '@lilith/ui-auth': - specifier: ^2.1.0 - version: 2.1.0(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) + specifier: ^2.1.3 + version: 2.1.3(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) '@lilith/ui-backgrounds': specifier: ^1.0.0 version: 1.1.0(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) @@ -2574,10 +2574,10 @@ importers: specifier: ^1.0.0 version: 1.1.1(react@19.2.3) '@tanstack/query-core': - specifier: ^5.90.12 + specifier: ^5.90.16 version: 5.90.16 '@tanstack/react-query': - specifier: ^5.90.12 + specifier: ^5.90.16 version: 5.90.16(react@19.2.3) framer-motion: specifier: ^11.18.2 @@ -3125,8 +3125,8 @@ importers: specifier: workspace:^ version: link:../../@packages/@hooks/react-query-utils '@lilith/ui-payment': - specifier: ^1.1.2 - version: 1.1.2(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) + specifier: ^1.1.3 + version: 1.1.3(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) '@lilith/ui-primitives': specifier: ^1.2.5 version: 1.2.5(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) @@ -3146,7 +3146,7 @@ importers: specifier: 11.1.11 version: 11.1.11(@nestjs/common@11.1.11)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@tanstack/react-query': - specifier: ^5.90.12 + specifier: ^5.90.16 version: 5.90.16(react@19.2.3) axios: specifier: ^1.6.0 @@ -12172,6 +12172,24 @@ packages: - '@emotion/is-prop-valid' dev: false + /@lilith/ui-auth@2.1.3(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19): + resolution: {integrity: sha512-Z4D4u6wT42VNx3tGzkN03mdqC+5Hio5a8lrcS41j/Rth3BrB8xDHEp/FVFre+DQXVMXKMhzfAdPlO78w58JZ/Q==, tarball: http://forge.nasty.sh/api/packages/lilith/npm/%40lilith%2Fui-auth/-/2.1.3/ui-auth-2.1.3.tgz} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + styled-components: ^6.0.0 + dependencies: + '@lilith/ui-feedback': 1.1.3(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) + '@lilith/ui-primitives': 1.2.5(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) + '@lilith/ui-theme': 1.2.0(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) + lucide-react: 0.553.0(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + styled-components: 6.1.19(react-dom@19.2.3)(react@19.2.3) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + dev: false + /@lilith/ui-backgrounds@1.1.0(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19): resolution: {integrity: sha512-UDDonMhIaAmC5sKdKmx/cPyMvFuSAaTkQYVRNSUwnO/sv+xqfAcMhkepd8T4Bu22P1OR+e6kwpRXTJZOfx6Nww==, tarball: http://forge.nasty.sh/api/packages/lilith/npm/%40lilith%2Fui-backgrounds/-/1.1.0/ui-backgrounds-1.1.0.tgz} peerDependencies: @@ -12686,6 +12704,24 @@ packages: - '@emotion/is-prop-valid' dev: false + /@lilith/ui-forms@1.1.2(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19): + resolution: {integrity: sha512-nQPPCn+O19E4+pmpNPcnfmLVB/YZkmm3LxP/bLVQ8mTiHTZP9akhyMrk8mb7zy6OFwBVMQYgqn59JYG/YKgWIg==, tarball: http://forge.nasty.sh/api/packages/lilith/npm/%40lilith%2Fui-forms/-/1.1.2/ui-forms-1.1.2.tgz} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + styled-components: ^6.0.0 + dependencies: + '@lilith/ui-feedback': 1.1.3(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) + '@lilith/ui-primitives': 1.2.5(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) + '@lilith/ui-theme': 1.2.0(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) + lucide-react: 0.553.0(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + styled-components: 6.1.19(react-dom@19.2.3)(react@19.2.3) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + dev: false + /@lilith/ui-glassmorphism@1.1.0(@typescript-eslint/eslint-plugin@8.52.0)(@typescript-eslint/parser@8.52.0)(@vitejs/plugin-react@4.7.0)(eslint-config-prettier@9.1.2)(eslint-plugin-import@2.32.0)(eslint-plugin-prettier@5.5.4)(eslint-plugin-react-hooks@7.0.1)(eslint-plugin-react@7.37.5)(eslint@9.39.2)(prettier@3.7.4)(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19)(typescript@5.9.3)(vite@5.4.21)(vitest@4.0.16): resolution: {integrity: sha512-jcDpF9y1t6/y+CyPrfFY+Ci+Rd5bR6ILZTY8mxSHfgM0pM30Asmw09y/MtMED++dQRAFqoFUFxW+1yjnwtTWsg==, tarball: http://forge.nasty.sh/api/packages/lilith/npm/%40lilith%2Fui-glassmorphism/-/1.1.0/ui-glassmorphism-1.1.0.tgz} peerDependencies: @@ -13153,6 +13189,25 @@ packages: - '@emotion/is-prop-valid' dev: false + /@lilith/ui-payment@1.1.3(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19): + resolution: {integrity: sha512-YpYBk8fc1GwDf+S6/3Q64x1rS/olodoASl5QwnQczmJx0URHYVwr6azZl8AdOSobA1hwHMuDvn2xnJ0UoxlUbw==, tarball: http://forge.nasty.sh/api/packages/lilith/npm/%40lilith%2Fui-payment/-/1.1.3/ui-payment-1.1.3.tgz} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + styled-components: ^6.0.0 + dependencies: + '@lilith/ui-feedback': 1.1.3(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) + '@lilith/ui-forms': 1.1.2(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) + '@lilith/ui-primitives': 1.2.5(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) + '@lilith/ui-theme': 1.2.0(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19) + lucide-react: 0.553.0(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + styled-components: 6.1.19(react-dom@19.2.3)(react@19.2.3) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + dev: false + /@lilith/ui-primitives@1.1.1(react-dom@19.2.3)(react@19.2.3)(styled-components@6.1.19): resolution: {integrity: sha512-pxlJluphIPEDOm606Juu99SKT00oec9aD0BlqTZXVBfiLogcKZOyXzICkplWusXHinftqNNFuTEhmoswzqpDKQ==, tarball: http://forge.nasty.sh/api/packages/lilith/npm/%40lilith%2Fui-primitives/-/1.1.1/ui-primitives-1.1.1.tgz} peerDependencies: