Selaa lähdekoodia

enhancements on including baseic mkcert for https

Dr-Swopt 1 päivä sitten
vanhempi
commit
d086d56f72

+ 9 - 2
angular.json

@@ -77,13 +77,20 @@
         },
         "serve": {
           "builder": "@angular/build:dev-server",
+          "options": {
+            "host": "0.0.0.0",
+            "port": 4200,
+            "ssl": true,
+            "sslCert": "cert/127.0.0.1+1.pem",
+            "sslKey": "cert/127.0.0.1+1-key.pem"
+          },
           "configurations": {
             "production": {
               "buildTarget": "frontend:build:production"
             },
             "development": {
               "buildTarget": "frontend:build:development"
-            }
+            },
           },
           "defaultConfiguration": "development"
         },
@@ -119,4 +126,4 @@
       }
     }
   }
-}
+}

+ 28 - 0
cert/127.0.0.1+1-key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDHXaPAKYkdty0k
+Hge1UmjwkR5MJYYLsLtwUsKhzVxoXUJcj2EeEm/AyHDZ1itSMXnK3ro8Dnjd0xv+
+efoHeJIYZ7UzrTWf69SK9C5jHdBPM+XQB5MsJ7P29bVGCjJ4ep4ggY7je/SPSnV2
+SlnB3j7jjZHqfvgU9rZUYgvdDCc3h8Xj1p8XjaJFzvJTm3B62HZwD67jA0PwCfUz
+EVEQJRJFTwLn3XRm3bpMRxPGna6MaOXveX9zXn4BGtrGtX6IxoD0zHHKGy5RdvJn
+DMy8qnX7/Ho1qRXl/Nmob8S0rI1PBvodGr/KIluHaA9o4UO3dwRgfCaPenh4Ko+b
+QvARvaUtAgMBAAECggEAQJBqv4i0BxOTYub2yBnwMjhM/4wHZTHPAglLTusayhGp
+tCAa64o89snzAhkB3pR3ROPsnBZzviLoJfmKp3C8n3q2jA3EGA5fvsBlZWP6WiwM
+eNp7JwmUlp3sHsqenbXYD97lT3aNNPqAH9bkSoyXAUqPvslvvhpH4fv+q4+MA8c5
+g8x9AVnQY2kVdRcr0zLgfGQJxPYgL+nWUhn/pzRO0sdm/zJyvpVZtrJdIH85VdoD
+IUR86e4jlsxsKJ7bl2rSzx393A1tLmnKanJTT8wl/PtZ527tSCqcuxVkQM84Tvgj
+8nXn8HgtYhSAMoOeZoeFMUm8gD2R2lFbRB7zULhxAQKBgQD6/l2+G+GOpUGYPzac
+dzJC1iIMdEnEEyOywf8l8nmWwNP39Yp0nddleu0mu11njvh0nOspT+m7ZUjqFkhs
+q3139nNyLGIeg4WHDn+FbIW4RCfwjPRcuknrRbDxmsCmBpZSjrLXYA0VvdVlii0u
+EJqJPpNoXZ1ZSxn7GTqW43x66QKBgQDLV6Y4uQI5rfJ3ubrLNGUF99v/iaXZVkPh
+asuDZNXFWMo+TG7EI6HHylq/j34bswBmknCjWmvQ7ULmTaz+rstGoVE4Cm6+/gJ9
+JXL2bM8UpWI0hGn6zERiyTJu3XlZ2AS9Cw3yLg/lEpi3GgBmlbXWmXqSpuL7kib+
++Mpn2hDlpQKBgQDlFVUqNvhf4aVE+C04EfLl3dul0l2hgHaMqVPfprgjSEwvfQSp
++4alMNVTDJ/r7SoIBVD9m9qRF5i9Tyk7Rip2W5JzGt9TSmeNJUZu2OYTkOGDRKOk
+HsNo4WrmmYBMCKcbIvNIcHqA5Yrn6n3iFXV23o5cK1V6Mnm8HQLExUzQQQKBgC9R
+x1G95AGuNBWeeBSfrb60zlJqItkv1P4ZDyEVjxWssuvKd6BXNme69GFNsCgcAMTd
+4S5ydVKaVA4qF07xOEbIdZEYBGuXytZ6p4UnDw2b6v2TruH5NRTUA1N/YKUCux+O
++gDYrUQ+jqFVgLBeuIEnGDoWcg3fFgoRtXBzc6ktAoGBANeTLJIa8C3x5DZ1oOca
+8B4+bjyrqQDTHF3V+eebHa9fY+55fyX3gaPpdGyCqtbfBQ6Bc+lD/VAZjhLLyPf/
+JTDIDf2cYrdp4qMGCa/IpYdHfW3/gWgd0dXc71PtaXjcUhB0sfC8BbUAI9yxcY2k
+e5dUYISNi3Z62lsd+ra9KeWa
+-----END PRIVATE KEY-----

+ 25 - 0
cert/127.0.0.1+1.pem

@@ -0,0 +1,25 @@
+-----BEGIN CERTIFICATE-----
+MIIENDCCApygAwIBAgIQdxblIyL+7/IkNzrrKgw+FzANBgkqhkiG9w0BAQsFADB5
+MR4wHAYDVQQKExVta2NlcnQgZGV2ZWxvcG1lbnQgQ0ExJzAlBgNVBAsMHlNPREMx
+NlxlbnpvQFNPUEMtMjNEMTAxIChFbnpvKTEuMCwGA1UEAwwlbWtjZXJ0IFNPREMx
+NlxlbnpvQFNPUEMtMjNEMTAxIChFbnpvKTAeFw0yNjA0MjEwMzAwMzhaFw0yODA3
+MjEwMzAwMzhaMFIxJzAlBgNVBAoTHm1rY2VydCBkZXZlbG9wbWVudCBjZXJ0aWZp
+Y2F0ZTEnMCUGA1UECwweU09EQzE2XGVuem9AU09QQy0yM0QxMDEgKEVuem8pMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx12jwCmJHbctJB4HtVJo8JEe
+TCWGC7C7cFLCoc1caF1CXI9hHhJvwMhw2dYrUjF5yt66PA543dMb/nn6B3iSGGe1
+M601n+vUivQuYx3QTzPl0AeTLCez9vW1RgoyeHqeIIGO43v0j0p1dkpZwd4+442R
+6n74FPa2VGIL3QwnN4fF49afF42iRc7yU5tweth2cA+u4wND8An1MxFRECUSRU8C
+5910Zt26TEcTxp2ujGjl73l/c15+ARraxrV+iMaA9MxxyhsuUXbyZwzMvKp1+/x6
+NakV5fzZqG/EtKyNTwb6HRq/yiJbh2gPaOFDt3cEYHwmj3p4eCqPm0LwEb2lLQID
+AQABo18wXTAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYD
+VR0jBBgwFoAUtrkpVhXxR16EF3vN5zAF08sezWQwFQYDVR0RBA4wDIcEfwAAAYcE
+wKhkZDANBgkqhkiG9w0BAQsFAAOCAYEAOYQXLFUi+MQ/DA5IrrfDWqxTCXNs46TQ
+6vDD3dZyM1ZbwOV7QRGc9SBkfN9GqiLOcFxJw3na6Jgv4WNabpyd0UTBJ/BVAyCw
+1NgpNJaNDrWdNGLDaff+PyVxzMyomkm6B3nvBROYAQKyZKV30A3kOQdKZFGKV+A7
+vPjOfdLeZJdQE/XSOvwWfrp0WcnH5pmLU2845QKly6ViKykOQmg5Q8/vXF88wlmh
+VuY6REPtfXYy5OiShzn0gCofwH8ebET+UKQbDe5btNexJAVYDWds3/ncg0u9VcK5
+TpZ9s491qDICygdGZoV37i45IlqPNZgZfjsFEMvjmVO+5TvvJ+jW5dRTcxIC7Vkr
+Ni8dig+7qI6pIz0/LiTi95ySuPtcBCvIJJjhQpq44LAQmOE3LKaFpzUPWZE8M9C+
+bmfo2ojztDrAh/98ailUfUb7+lzhbc5SUuJpyN8Nm9CnNP+SBbyLzjL8229PgFXG
+CrI5n1eMmFoAPHZGZUolFHqzT9hnogCe
+-----END CERTIFICATE-----

+ 42 - 16
src/app/components/chatbot/chatbot.component.ts

@@ -12,6 +12,7 @@ import {
   ViewChild,
   ElementRef,
   AfterViewChecked,
+  OnInit,
 } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { FormsModule } from '@angular/forms';
@@ -32,27 +33,48 @@ export interface ChatMessage {
   templateUrl: './chatbot.component.html',
   styleUrls: ['./chatbot.component.scss'],
 })
-export class ChatbotComponent implements AfterViewChecked {
+export class ChatbotComponent implements OnInit, AfterViewChecked {
+  private static readonly STORAGE_KEY = 'palm_ai_chat_history';
+
   @ViewChild('messageList') messageListRef!: ElementRef<HTMLDivElement>;
 
-  messages = signal<ChatMessage[]>([
-    {
-      role: 'bot',
-      text: 'RAG pipeline ready. Ask me about palm oil operational data.',
-      timestamp: new Date(),
-    },
-  ]);
+  messages = signal<ChatMessage[]>(this.loadMessages());
 
   inputText = '';
   loading = signal<boolean>(false);
 
   private shouldScrollToBottom = false;
 
+  ngOnInit(): void {
+    this.shouldScrollToBottom = true;
+  }
+
   constructor(
     public chatSocket: ChatSocketService,
     public surveillance: SurveillanceService,
   ) {}
 
+  private loadMessages(): ChatMessage[] {
+    try {
+      const raw = localStorage.getItem(ChatbotComponent.STORAGE_KEY);
+      if (raw) {
+        const parsed: ChatMessage[] = JSON.parse(raw);
+        return parsed.map(m => ({ ...m, timestamp: new Date(m.timestamp) }));
+      }
+    } catch {}
+    return [{
+      role: 'bot',
+      text: 'RAG pipeline ready. Ask me about palm oil operational data.',
+      timestamp: new Date(),
+    }];
+  }
+
+  private saveMessages(msgs: ChatMessage[]): void {
+    try {
+      localStorage.setItem(ChatbotComponent.STORAGE_KEY, JSON.stringify(msgs));
+    } catch {}
+  }
+
   ngAfterViewChecked(): void {
     if (this.shouldScrollToBottom) {
       this.scrollToBottom();
@@ -103,18 +125,22 @@ export class ChatbotComponent implements AfterViewChecked {
   }
 
   onClearChat(): void {
-    this.messages.set([
-      {
-        role: 'bot',
-        text: 'Chat cleared. RAG pipeline ready.',
-        timestamp: new Date(),
-      },
-    ]);
+    const reset: ChatMessage[] = [{
+      role: 'bot',
+      text: 'Chat cleared. RAG pipeline ready.',
+      timestamp: new Date(),
+    }];
+    this.messages.set(reset);
+    this.saveMessages(reset);
     this.chatSocket.clearBackendSession();
   }
 
   private pushMessage(msg: ChatMessage): void {
-    this.messages.update(msgs => [...msgs, msg]);
+    this.messages.update(msgs => {
+      const updated = [...msgs, msg];
+      this.saveMessages(updated);
+      return updated;
+    });
     this.shouldScrollToBottom = true;
   }
 

+ 2 - 0
src/app/services/chat-socket.service.ts

@@ -41,6 +41,8 @@ export class ChatSocketService implements OnDestroy {
       transports: ['websocket'],
       reconnection: true,
       reconnectionDelay: 1000,
+      secure: true,
+      rejectUnauthorized: false,
     });
   }
 

+ 2 - 0
src/app/services/surveillance.service.ts

@@ -41,6 +41,8 @@ export class SurveillanceService implements OnDestroy {
       transports: ['websocket'],
       reconnection: true,
       reconnectionDelay: 1000,
+      secure: true,
+      rejectUnauthorized: false,
     });
 
     this.socket.on('connect', () => {

+ 2 - 0
src/app/services/vision-socket.service.ts

@@ -45,6 +45,8 @@ export class VisionSocketService implements OnDestroy {
       transports: ['websocket'],
       reconnection: true,
       reconnectionDelay: 1000,
+      secure: true,
+      rejectUnauthorized: false,
     });
 
     this.socket.on('connect', () => this.connected.set(true));

+ 2 - 2
src/environments/environment.ts

@@ -1,6 +1,6 @@
 export const environment = {
   production: false,
-  apiUrl: 'http://192.168.100.100:3000',
-  nestWsUrl: 'http://192.168.100.100:3000',   // Socket.io host (monitor + vision + embedding)
+  apiUrl: 'https://192.168.100.100:3000',
+  nestWsUrl: 'https://192.168.100.100:3000',   // Socket.io host (monitor + vision + embedding)
   n8nWebhookUrl: 'http://localhost:5678/webhook/rag-query', // n8n RAG entry webhook
 };