diff --git a/.env b/.env.local
similarity index 65%
rename from .env
rename to .env.local
index 1a2b47f98f..fb35ddc973 100644
--- a/.env
+++ b/.env.local
@@ -2,4 +2,4 @@ gist_token=<token>
 account_passphrase=<passphrase>
 account_password=<password>
 NODE_OPTIONS=--max-old-space-size=2048
-# WALLET_CONNECT_PROJECT_ID=<walletconnect cloud PROJECT_ID>
+WALLET_CONNECT_PROJECT_ID=<project_id>
diff --git a/.gitignore b/.gitignore
index 7955bf6455..ab74544426 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@ soljson.js
 *_group*.ts
 stats.json
 release
+.env
 
 
 # compiled output
diff --git a/apps/remix-dapp/src/locales/en/udapp.json b/apps/remix-dapp/src/locales/en/udapp.json
index 3d28dc9dc0..8fbb32f619 100644
--- a/apps/remix-dapp/src/locales/en/udapp.json
+++ b/apps/remix-dapp/src/locales/en/udapp.json
@@ -26,7 +26,7 @@
   "udapp.contractOptionsTitle2": "Select a compiled contract to deploy or to use with At Address.",
   "udapp.contractOptionsTitle3": "Select and compile *.sol file to deploy or access a contract.",
   "udapp.contractOptionsTitle4": "When there is a compiled .sol file, choose the  contract to deploy or to use with At Address.",
-  "udapp.checkSumWarning": "It seems you are not using a checksumed address.A checksummed address is an address that contains uppercase letters, as specified in {a}.Checksummed addresses are meant to help prevent users from sending transactions to the wrong address.",
+  "udapp.checkSumWarning": "It seems you are not using a checksummed address.A checksummed address is an address that contains uppercase letters, as specified in {a}.Checksummed addresses are meant to help prevent users from sending transactions to the wrong address.",
   "udapp.isOverSizePromptEip170": "Contract creation initialization returns data with length of more than 24576 bytes. The deployment will likely fail if the current network has activated the eip 170. More info: {a}",
   "udapp.isOverSizePromptEip3860": "Contract creation init code exceeds the allowed max code size of 49152 bytes. The deployment will likely fail if the current network has activated the eip 3860. More info: {a}",
   "udapp.thisContractMayBeAbstract": "This contract may be abstract, it may not implement an abstract parent's methods completely or it may not invoke an inherited contract's constructor correctly.",
diff --git a/apps/remix-dapp/src/locales/zh/udapp.json b/apps/remix-dapp/src/locales/zh/udapp.json
index 35dad029bb..7fb99322b3 100644
--- a/apps/remix-dapp/src/locales/zh/udapp.json
+++ b/apps/remix-dapp/src/locales/zh/udapp.json
@@ -23,7 +23,7 @@
   "udapp.contractOptionsTitle2": "选择要部署或与 At Address 一起使用的已编译合约。",
   "udapp.contractOptionsTitle3": "选择并编译 *.sol 文件以部署或访问合约。",
   "udapp.contractOptionsTitle4": "当有编译的 .sol 文件时,选择 {br} 合约进行部署或与 AtAddress 一起使用。",
-  "udapp.checkSumWarning": "您似乎没有使用 checksumed address 。{br} checksumed address 是包含大写字母的地址,如 {a} 中所指定。{br} checksumed address 旨在帮助防止用户将交易发送到错误地址。",
+  "udapp.checkSumWarning": "您似乎没有使用 checksummed address 。{br} checksummed address 是包含大写字母的地址,如 {a} 中所指定。{br} checksummed address 旨在帮助防止用户将交易发送到错误地址。",
   "udapp.isOverSizePromptEip170": "合约创建初始化返回长度超过24576字节的数据。部署可能会失败。 {br}更多信息:{a}",
   "udapp.isOverSizePromptEip3860": "合约创建初始化代码超出了允许的最大代码大小 49152 字节。如果当前网络已激活 eip 3860,则部署可能会失败。更多信息:{a}",
   "udapp.thisContractMayBeAbstract": "这个合约可能是抽象的,它可能没有完全实现抽象父类的方法,或者它可能没有正确调用继承合约的构造函数。",
diff --git a/apps/remix-ide-e2e/src/commands/selectContract.ts b/apps/remix-ide-e2e/src/commands/selectContract.ts
index d270f8949d..87bbc40c30 100644
--- a/apps/remix-ide-e2e/src/commands/selectContract.ts
+++ b/apps/remix-ide-e2e/src/commands/selectContract.ts
@@ -4,19 +4,14 @@ import EventEmitter from 'events'
 const selector = '.udapp_contractNames'
 
 class SelectContract extends EventEmitter {
-  command (this: NightwatchBrowser, contractName: string): NightwatchBrowser {
-    this.api.waitForElementVisible(selector).perform((done) => {
-      selectContract(this.api, contractName, () => {
-        done()
-        this.emit('complete')
-      })
-    })
+  command(this: NightwatchBrowser, contractName: string): NightwatchBrowser {
+    this.api
+      .waitForElementVisible(selector)
+      .waitForElementPresent(`${selector} option[value="${contractName}"]`)
+      .click(`${selector} option[value="${contractName}"]`)
+      .perform(() => this.emit('complete'))
     return this
   }
 }
 
-function selectContract (browser: NightwatchBrowser, contractName: string, callback: VoidFunction) {
-  browser.click(`${selector} option[value="${contractName}"]`).perform(() => callback())
-}
-
 module.exports = SelectContract
diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts
index 8aa15f221c..77bb44f548 100644
--- a/apps/remix-ide-e2e/src/tests/terminal.test.ts
+++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts
@@ -209,18 +209,16 @@ module.exports = {
       .createContract('')
       .getAddressAtPosition(0, (address) => {
         addressRef = address
-      })
-      .perform((done) => {
         browser.addFile('scripts/test_filtering_event.ts', { content: test_filtering_event.replace('<ADDRESS>', addressRef) })
-        .perform(() => done())
+          .executeScriptInTerminal('remix.execute(\'scripts/test_filtering_event.ts\')')
+          .pause(1000)
+          .waitForElementContainsText('*[data-id="terminalJournal"]', '1')
+          .waitForElementContainsText('*[data-id="terminalJournal"]', 'true')
+          .executeScriptInTerminal('remix.execute(\'scripts/test_filtering_event.ts\')') // re-emit the event
+          .waitForElementContainsText('*[data-id="terminalJournal"]', '2')
+          .waitForElementContainsText('*[data-id="terminalJournal"]', 'false')
       })
-      .executeScriptInTerminal('remix.execute(\'scripts/test_filtering_event.ts\')')
-      .pause(1000)
-      .waitForElementContainsText('*[data-id="terminalJournal"]', '1')
-      .waitForElementContainsText('*[data-id="terminalJournal"]', 'true')
-      .executeScriptInTerminal('remix.execute(\'scripts/test_filtering_event.ts\')') // re-emit the event
-      .waitForElementContainsText('*[data-id="terminalJournal"]', '2')
-      .waitForElementContainsText('*[data-id="terminalJournal"]', 'false')
+
   },
 
   'Should display auto-complete menu #group4': function (browser: NightwatchBrowser) {
diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.ts
similarity index 88%
rename from apps/remix-ide/src/app.js
rename to apps/remix-ide/src/app.ts
index ab3b9ff246..86eb8697a2 100644
--- a/apps/remix-ide/src/app.js
+++ b/apps/remix-ide/src/app.ts
@@ -26,21 +26,21 @@ import { WalkthroughService } from './walkthroughService'
 
 import { OffsetToLineColumnConverter, CompilerMetadata, CompilerArtefacts, FetchAndCompile, CompilerImports, GistHandler } from '@remix-project/core-plugin'
 
-import {Registry} from '@remix-project/remix-lib'
-import {ConfigPlugin} from './app/plugins/config'
-import {StoragePlugin} from './app/plugins/storage'
-import {Layout} from './app/panels/layout'
-import {NotificationPlugin} from './app/plugins/notification'
-import {Blockchain} from './blockchain/blockchain'
-import {MergeVMProvider, LondonVMProvider, BerlinVMProvider, ShanghaiVMProvider, CancunVMProvider} from './app/providers/vm-provider'
-import {MainnetForkVMProvider} from './app/providers/mainnet-vm-fork-provider'
-import {SepoliaForkVMProvider} from './app/providers/sepolia-vm-fork-provider'
-import {GoerliForkVMProvider} from './app/providers/goerli-vm-fork-provider'
-import {CustomForkVMProvider} from './app/providers/custom-vm-fork-provider'
-import {HardhatProvider} from './app/providers/hardhat-provider'
-import {GanacheProvider} from './app/providers/ganache-provider'
-import {FoundryProvider} from './app/providers/foundry-provider'
-import {ExternalHttpProvider} from './app/providers/external-http-provider'
+import { Registry } from '@remix-project/remix-lib'
+import { ConfigPlugin } from './app/plugins/config'
+import { StoragePlugin } from './app/plugins/storage'
+import { Layout } from './app/panels/layout'
+import { NotificationPlugin } from './app/plugins/notification'
+import { Blockchain } from './blockchain/blockchain'
+import { MergeVMProvider, LondonVMProvider, BerlinVMProvider, ShanghaiVMProvider, CancunVMProvider } from './app/providers/vm-provider'
+import { MainnetForkVMProvider } from './app/providers/mainnet-vm-fork-provider'
+import { SepoliaForkVMProvider } from './app/providers/sepolia-vm-fork-provider'
+import { GoerliForkVMProvider } from './app/providers/goerli-vm-fork-provider'
+import { CustomForkVMProvider } from './app/providers/custom-vm-fork-provider'
+import { HardhatProvider } from './app/providers/hardhat-provider'
+import { GanacheProvider } from './app/providers/ganache-provider'
+import { FoundryProvider } from './app/providers/foundry-provider'
+import { ExternalHttpProvider } from './app/providers/external-http-provider'
 import { EnvironmentExplorer } from './app/providers/environment-explorer'
 import { FileDecorator } from './app/plugins/file-decorator'
 import { CodeFormat } from './app/plugins/code-format'
@@ -58,7 +58,7 @@ import { xtermPlugin } from './app/plugins/electron/xtermPlugin'
 import { ripgrepPlugin } from './app/plugins/electron/ripgrepPlugin'
 import { compilerLoaderPlugin, compilerLoaderPluginDesktop } from './app/plugins/electron/compilerLoaderPlugin'
 import { appUpdaterPlugin } from './app/plugins/electron/appUpdaterPlugin'
-import { remixAIDesktopPlugin } from './app/plugins/electron/remixAIDesktopPlugin' 
+import { remixAIDesktopPlugin } from './app/plugins/electron/remixAIDesktopPlugin'
 import { RemixAIPlugin } from './app/plugins/remixAIPlugin'
 import { SlitherHandleDesktop } from './app/plugins/electron/slitherPlugin'
 import { SlitherHandle } from './app/files/slither-handle'
@@ -72,9 +72,9 @@ import { Matomo } from './app/plugins/matomo'
 
 import { TemplatesSelectionPlugin } from './app/plugins/templates-selection/templates-selection-plugin'
 
-const isElectron = require('is-electron')
+import isElectron from 'is-electron'
 
-const remixLib = require('@remix-project/remix-lib')
+import * as remixLib from '@remix-project/remix-lib'
 
 import { QueryParams } from '@remix-project/remix-lib'
 import { SearchPlugin } from './app/tabs/search'
@@ -82,27 +82,27 @@ import { ScriptRunnerUIPlugin } from './app/tabs/script-runner-ui'
 import { ElectronProvider } from './app/files/electronProvider'
 
 const Storage = remixLib.Storage
-const RemixDProvider = require('./app/files/remixDProvider')
-const Config = require('./config')
+import RemixDProvider from './app/files/remixDProvider'
+import Config from './config'
 
-const FileManager = require('./app/files/fileManager')
+import FileManager from './app/files/fileManager'
 import FileProvider from "./app/files/fileProvider"
 import { appPlatformTypes } from '@remix-ui/app'
 
-const DGitProvider = require('./app/files/dgitProvider')
-const WorkspaceFileProvider = require('./app/files/workspaceFileProvider')
+import DGitProvider from './app/files/dgitProvider'
+import WorkspaceFileProvider from './app/files/workspaceFileProvider'
 
-const PluginManagerComponent = require('./app/components/plugin-manager-component')
+import PluginManagerComponent from './app/components/plugin-manager-component'
 
-const CompileTab = require('./app/tabs/compile-tab')
-const SettingsTab = require('./app/tabs/settings-tab')
-const AnalysisTab = require('./app/tabs/analysis-tab')
-const { DebuggerTab } = require('./app/tabs/debugger-tab')
-const TestTab = require('./app/tabs/test-tab')
-const FilePanel = require('./app/panels/file-panel')
-const Editor = require('./app/editor/editor')
-const Terminal = require('./app/panels/terminal')
-const { TabProxy } = require('./app/panels/tab-proxy.js')
+import CompileTab from './app/tabs/compile-tab'
+import SettingsTab from './app/tabs/settings-tab'
+import AnalysisTab from './app/tabs/analysis-tab'
+import DebuggerTab from './app/tabs/debugger-tab'
+import TestTab from './app/tabs/test-tab'
+import Filepanel from './app/panels/file-panel'
+import Editor from './app/editor/editor'
+import Terminal from './app/panels/terminal'
+import TabProxy from './app/panels/tab-proxy.js'
 
 const _paq = (window._paq = window._paq || [])
 
@@ -115,16 +115,49 @@ export class platformApi {
   }
 }
 
+type Components = {
+  filesProviders: {
+    browser?: any
+    localhost?: any
+    workspace?: any
+    electron?: any
+  }
+}
+
 class AppComponent {
+  appManager: RemixAppManager
+  queryParams: QueryParams
+  private _components: Components
+  panels: any
+  workspace: any
+  engine: RemixEngine
+  matomoConfAlreadySet: any
+  matomoCurrentSetting: any
+  showMatomo: boolean
+  walkthroughService: WalkthroughService
+  platform: 'desktop' | 'web'
+  gistHandler: GistHandler
+  themeModule: ThemeModule
+  localeModule: LocaleModule
+  notification: NotificationPlugin
+  layout: Layout
+  mainview: any
+  menuicons: VerticalIcons
+  sidePanel: SidePanel
+  hiddenPanel: HiddenPanel
+  pinnedPanel: PinnedPanel
+  popupPanel: PopupPanel
+  statusBar: StatusBar
+  settings: SettingsTab
   constructor() {
     const PlatFormAPi = new platformApi()
     Registry.getInstance().put({
       api: PlatFormAPi,
       name: 'platform'
     })
-    this.appManager = new RemixAppManager({})
+    this.appManager = new RemixAppManager()
     this.queryParams = new QueryParams()
-    this._components = {}
+    this._components = {} as Components
     // setup storage
     const configStorage = new Storage('config-v0.8:')
 
@@ -161,7 +194,6 @@ class AppComponent {
       name: 'fileproviders'
     })
 
-
   }
 
   async run() {
@@ -184,7 +216,7 @@ class AppComponent {
     this.matomoConfAlreadySet = Registry.getInstance().get('config').api.exists('settings/matomo-analytics')
     this.matomoCurrentSetting = Registry.getInstance().get('config').api.get('settings/matomo-analytics')
 
-    let electronTracking = window.electronAPI ? await window.electronAPI.canTrackMatomo() : false
+    const electronTracking = (window as any).electronAPI ? await (window as any).electronAPI.canTrackMatomo() : false
 
     const lastMatomoCheck = window.localStorage.getItem('matomo-analytics-consent')
     const sixMonthsAgo = new Date();
@@ -193,11 +225,11 @@ class AppComponent {
     const e2eforceMatomoToShow = window.localStorage.getItem('showMatomo') && window.localStorage.getItem('showMatomo') === 'true'
     const contextShouldShowMatomo = matomoDomains[window.location.hostname] || e2eforceMatomoToShow || electronTracking
     const shouldRenewConsent = this.matomoCurrentSetting === false && (!lastMatomoCheck || new Date(Number(lastMatomoCheck)) < sixMonthsAgo) // it is set to false for more than 6 months.
-    this.showMatomo = contextShouldShowMatomo && (!this.matomoConfAlreadySet || shouldRenewConsent)        
+    this.showMatomo = contextShouldShowMatomo && (!this.matomoConfAlreadySet || shouldRenewConsent)
 
     if (this.showMatomo && shouldRenewConsent) {
       _paq.push(['trackEvent', 'Matomo', 'refreshMatomoPermissions']);
-    }    
+    }
 
     this.walkthroughService = new WalkthroughService(appManager)
 
@@ -387,7 +419,7 @@ class AppComponent {
       ganacheProvider,
       foundryProvider,
       externalHttpProvider,
-      environmentExplorer,  
+      environmentExplorer,
       this.walkthroughService,
       search,
       solidityumlgen,
@@ -456,10 +488,10 @@ class AppComponent {
     this.popupPanel = new PopupPanel()
 
     const pluginManagerComponent = new PluginManagerComponent(appManager, this.engine)
-    const filePanel = new FilePanel(appManager, contentImport)
+    const filePanel = new Filepanel(appManager, contentImport)
     this.statusBar = new StatusBar(filePanel, this.menuicons)
     const landingPage = new LandingPage(appManager, this.menuicons, fileManager, filePanel, contentImport)
-    this.settings = new SettingsTab(Registry.getInstance().get('config').api, editor, appManager)
+    this.settings = new SettingsTab(Registry.getInstance().get('config').api, editor)//, appManager)
 
     this.engine.register([this.menuicons, landingPage, this.hiddenPanel, this.sidePanel, this.statusBar, filePanel, pluginManagerComponent, this.settings, this.pinnedPanel, this.popupPanel])
 
@@ -514,7 +546,7 @@ class AppComponent {
 
   async activate() {
     const queryParams = new QueryParams()
-    const params = queryParams.get()
+    const params: any = queryParams.get()
 
     try {
       this.engine.register(await this.appManager.registeredPlugins())
@@ -610,10 +642,11 @@ class AppComponent {
             }
 
             if (params.call) {
-              const callDetails = params.call.split('//')
+              const callDetails: any = params.call.split('//')
               if (callDetails.length > 1) {
                 this.appManager.call('notification', 'toast', `initiating ${callDetails[0]} and calling "${callDetails[1]}" ...`)
                 // @todo(remove the timeout when activatePlugin is on 0.3.0)
+                //@ts-ignore
                 await this.appManager.call(...callDetails).catch(console.error)
               }
             }
@@ -629,6 +662,7 @@ class AppComponent {
 
                   // @todo(remove the timeout when activatePlugin is on 0.3.0)
                   try {
+                    //@ts-ignore
                     await this.appManager.call(...callDetails)
                   } catch (e) {
                     console.error(e)
diff --git a/apps/remix-ide/src/app/components/main-panel.tsx b/apps/remix-ide/src/app/components/main-panel.tsx
index e48399e839..a7f8a6a422 100644
--- a/apps/remix-ide/src/app/components/main-panel.tsx
+++ b/apps/remix-ide/src/app/components/main-panel.tsx
@@ -15,7 +15,7 @@ const profile = {
 export class MainPanel extends AbstractPanel {
   element: HTMLDivElement
   dispatch: React.Dispatch<any> = () => {}
-  constructor(config) {
+  constructor(config = null) {
     super(profile)
     this.element = document.createElement('div')
     this.element.setAttribute('data-id', 'mainPanelPluginsContainer')
diff --git a/apps/remix-ide/src/app/components/plugin-manager-component.js b/apps/remix-ide/src/app/components/plugin-manager-component.js
index 816d9c1c11..e4471bbed2 100644
--- a/apps/remix-ide/src/app/components/plugin-manager-component.js
+++ b/apps/remix-ide/src/app/components/plugin-manager-component.js
@@ -19,7 +19,7 @@ const profile = {
   maintainedBy: "Remix"
 }
 
-class PluginManagerComponent extends ViewPlugin {
+export default class PluginManagerComponent extends ViewPlugin {
   constructor (appManager, engine) {
     super(profile)
     this.appManager = appManager
diff --git a/apps/remix-ide/src/app/components/popup-panel.tsx b/apps/remix-ide/src/app/components/popup-panel.tsx
index b000fde79d..1728dbfbba 100644
--- a/apps/remix-ide/src/app/components/popup-panel.tsx
+++ b/apps/remix-ide/src/app/components/popup-panel.tsx
@@ -24,7 +24,7 @@ export class PopupPanel extends AbstractPanel {
   dispatch: React.Dispatch<any> = () => { }
   appStateDispatch: React.Dispatch<AppAction> = () => { }
 
-  constructor(config) {
+  constructor(config = null) {
     super(profile)
     this.event = new EventEmitter()
   }
diff --git a/apps/remix-ide/src/app/editor/editor.js b/apps/remix-ide/src/app/editor/editor.js
index b5f763db62..04259079aa 100644
--- a/apps/remix-ide/src/app/editor/editor.js
+++ b/apps/remix-ide/src/app/editor/editor.js
@@ -16,7 +16,7 @@ const profile = {
   methods: ['highlight', 'discardHighlight', 'clearAnnotations', 'addLineText', 'discardLineTexts', 'addAnnotation', 'gotoLine', 'revealRange', 'getCursorPosition', 'open', 'addModel','addErrorMarker', 'clearErrorMarkers', 'getText', 'getPositionAt', 'openReadOnly'],
 }
 
-class Editor extends Plugin {
+export default class Editor extends Plugin {
   constructor () {
     super(profile)
 
@@ -90,7 +90,7 @@ class Editor extends Plugin {
   }
 
   render () {
-    return <div ref={(element)=>{ 
+    return <div ref={(element)=>{
       this.ref = element
       this.ref.currentContent = () => this.currentContent() // used by e2e test
       this.ref.setCurrentContent = (value) => {
@@ -102,7 +102,7 @@ class Editor extends Plugin {
       this.ref.gotoLine = (line, column) => this.gotoLine(line, column || 0)
       this.ref.getCursorPosition = () => this.getCursorPosition()
       this.ref.addDecoration = (marker, filePath, typeOfDecoration) => this.addDecoration(marker, filePath, typeOfDecoration)
-      this.ref.clearDecorationsByPlugin = (filePath, plugin, typeOfDecoration) => this.clearDecorationsByPlugin(filePath, plugin, typeOfDecoration)      
+      this.ref.clearDecorationsByPlugin = (filePath, plugin, typeOfDecoration) => this.clearDecorationsByPlugin(filePath, plugin, typeOfDecoration)
       this.ref.keepDecorationsFor = (name, typeOfDecoration) => this.keepDecorationsFor(name, typeOfDecoration)
     }} id='editorView'>
       <PluginViewWrapper plugin={this} />
@@ -249,7 +249,7 @@ class Editor extends Plugin {
    */
   async _createSession (path, content, mode, readOnly) {
     if (!this.activated) return
-    
+
     this.emit('addModel', content, mode, path, readOnly || this.readOnlySessions[path])
     return {
       path,
@@ -548,7 +548,7 @@ class Editor extends Plugin {
     decoration.from = from
 
     const { currentDecorations, registeredDecorations } = this.api.addDecoration(decoration, path, typeOfDecoration)
-    if (!this.registeredDecorations[typeOfDecoration][filePath]) this.registeredDecorations[typeOfDecoration][filePath] = []    
+    if (!this.registeredDecorations[typeOfDecoration][filePath]) this.registeredDecorations[typeOfDecoration][filePath] = []
     this.registeredDecorations[typeOfDecoration][filePath].push(...registeredDecorations)
     if (!this.currentDecorations[typeOfDecoration][filePath]) this.currentDecorations[typeOfDecoration][filePath] = []
     this.currentDecorations[typeOfDecoration][filePath].push(...currentDecorations)
@@ -601,5 +601,3 @@ class Editor extends Plugin {
     return this.api.getPositionAt(offset)
   }
 }
-
-module.exports = Editor
diff --git a/apps/remix-ide/src/app/files/dgitProvider.ts b/apps/remix-ide/src/app/files/dgitProvider.ts
index cdb863b4b7..4a8778c0ef 100644
--- a/apps/remix-ide/src/app/files/dgitProvider.ts
+++ b/apps/remix-ide/src/app/files/dgitProvider.ts
@@ -28,7 +28,7 @@ const profile: LibraryProfile = {
     , 'getGitHubUser', 'remotebranches', 'remotecommits', 'repositories', 'getCommitChanges', 'compareBranches'],
   kind: 'file-system'
 }
-class DGitProvider extends Plugin<any, CustomRemixApi> {
+export default class DGitProvider extends Plugin<any, CustomRemixApi> {
   constructor() {
     super(profile)
   }
diff --git a/apps/remix-ide/src/app/files/fileManager.ts b/apps/remix-ide/src/app/files/fileManager.ts
index a821ced648..5b3e70ae4a 100644
--- a/apps/remix-ide/src/app/files/fileManager.ts
+++ b/apps/remix-ide/src/app/files/fileManager.ts
@@ -26,7 +26,7 @@ const profile = {
     'readFile', 'copyFile', 'copyDir', 'rename', 'mkdir', 'readdir', 'dirList', 'fileList', 'remove', 'getCurrentFile', 'getFile',
     'getFolder', 'setFile', 'switchFile', 'refresh', 'getProviderOf', 'getProviderByName', 'getPathFromUrl', 'getUrlFromPath',
     'saveCurrentFile', 'setBatchFiles', 'isGitRepo', 'isFile', 'isDirectory', 'hasGitSubmodule', 'copyFolderToJson', 'diff',
-    'hasGitSubmodules'
+    'hasGitSubmodules', 'getOpenedFiles'
   ],
   kind: 'file-system'
 }
@@ -40,7 +40,7 @@ const errorMsg = {
 const createError = (err) => {
   return new Error(`${errorMsg[err.code]} ${err.message || ''}`)
 }
-class FileManager extends Plugin {
+export default class FileManager extends Plugin {
   mode: string
   openedFiles: any
   editor: any
diff --git a/apps/remix-ide/src/app/files/remixDProvider.js b/apps/remix-ide/src/app/files/remixDProvider.js
index 62171fdc5b..f13ccbaa0c 100644
--- a/apps/remix-ide/src/app/files/remixDProvider.js
+++ b/apps/remix-ide/src/app/files/remixDProvider.js
@@ -1,7 +1,7 @@
 'use strict'
 import FileProvider from "./fileProvider"
 
-module.exports = class RemixDProvider extends FileProvider {
+export default class RemixDProvider extends FileProvider {
   constructor (appManager) {
     super('localhost')
     this._appManager = appManager
diff --git a/apps/remix-ide/src/app/files/workspaceFileProvider.js b/apps/remix-ide/src/app/files/workspaceFileProvider.js
index 900ad8ccba..c7e33862c4 100644
--- a/apps/remix-ide/src/app/files/workspaceFileProvider.js
+++ b/apps/remix-ide/src/app/files/workspaceFileProvider.js
@@ -3,7 +3,7 @@
 const EventManager = require('events')
 import FileProvider from "./fileProvider"
 
-class WorkspaceFileProvider extends FileProvider {
+export default class WorkspaceFileProvider extends FileProvider {
   constructor () {
     super('')
     this.workspacesPath = '.workspaces'
@@ -18,10 +18,10 @@ class WorkspaceFileProvider extends FileProvider {
         })
       }).catch((e) => {
         console.log(e)
-      })     
+      })
     } catch (e) {
       // we don't need to log error if this throws an error
-    }    
+    }
   }
 
   setWorkspace (workspace) {
diff --git a/apps/remix-ide/src/app/panels/file-panel.js b/apps/remix-ide/src/app/panels/file-panel.js
index 2b3946bca1..6277bffcc9 100644
--- a/apps/remix-ide/src/app/panels/file-panel.js
+++ b/apps/remix-ide/src/app/panels/file-panel.js
@@ -55,7 +55,7 @@ const profile = {
   version: packageJson.version,
   maintainedBy: 'Remix'
 }
-module.exports = class Filepanel extends ViewPlugin {
+export default class Filepanel extends ViewPlugin {
   constructor(appManager, contentImport) {
     super(profile)
     this.registry = Registry.getInstance()
diff --git a/apps/remix-ide/src/app/panels/layout.ts b/apps/remix-ide/src/app/panels/layout.ts
index 539a9b1c48..2ed6541d9e 100644
--- a/apps/remix-ide/src/app/panels/layout.ts
+++ b/apps/remix-ide/src/app/panels/layout.ts
@@ -12,7 +12,7 @@ const profile: Profile = {
 interface panelState {
   active: boolean
   plugin: Plugin
-  minimized: boolean
+  minimized?: boolean
 }
 interface panels {
   tabs: panelState
diff --git a/apps/remix-ide/src/app/panels/tab-proxy.js b/apps/remix-ide/src/app/panels/tab-proxy.js
index d71bd3ec6a..8c90ca8b8e 100644
--- a/apps/remix-ide/src/app/panels/tab-proxy.js
+++ b/apps/remix-ide/src/app/panels/tab-proxy.js
@@ -10,7 +10,7 @@ const profile = {
   kind: 'other'
 }
 
-export class TabProxy extends Plugin {
+export default class TabProxy extends Plugin {
   constructor (fileManager, editor) {
     super(profile)
     this.event = new EventEmitter()
diff --git a/apps/remix-ide/src/app/panels/terminal.tsx b/apps/remix-ide/src/app/panels/terminal.tsx
index a30cf085bd..3623a592cb 100644
--- a/apps/remix-ide/src/app/panels/terminal.tsx
+++ b/apps/remix-ide/src/app/panels/terminal.tsx
@@ -24,7 +24,7 @@ const profile = {
   version: packageJson.version
 }
 
-class Terminal extends Plugin {
+export default class Terminal extends Plugin {
   fileImport: CompilerImports
   event: any
   globalRegistry: Registry
@@ -163,4 +163,3 @@ class Terminal extends Plugin {
   }
 }
 
-module.exports = Terminal
diff --git a/apps/remix-ide/src/app/plugins/remixAIPlugin.tsx b/apps/remix-ide/src/app/plugins/remixAIPlugin.tsx
index dbe2dcb4e5..0159b7d938 100644
--- a/apps/remix-ide/src/app/plugins/remixAIPlugin.tsx
+++ b/apps/remix-ide/src/app/plugins/remixAIPlugin.tsx
@@ -3,7 +3,7 @@ import { ViewPlugin } from '@remixproject/engine-web'
 import { Plugin } from '@remixproject/engine';
 import { RemixAITab, ChatApi } from '@remix-ui/remix-ai'
 import React, { useCallback } from 'react';
-import { ICompletions, IModel, RemoteInferencer, IRemoteModel, IParams, GenerationParams, CodeExplainAgent } from '@remix/remix-ai-core';
+import { ICompletions, IModel, RemoteInferencer, IRemoteModel, IParams, GenerationParams, CodeExplainAgent, SecurityAgent } from '@remix/remix-ai-core';
 import { CustomRemixApi } from '@remix-api'
 import { PluginViewWrapper } from '@remix-ui/helper'
 const _paq = (window._paq = window._paq || [])
@@ -17,9 +17,8 @@ const profile = {
   displayName: 'RemixAI',
   methods: ['code_generation', 'code_completion',
     "solidity_answer", "code_explaining",
-    "code_insertion", "error_explaining",
-    "initialize", 'chatPipe', 'ProcessChatRequestBuffer',
-    'isChatRequestPending'],
+    "code_insertion", "error_explaining", "vulnerability_check",
+    "initialize", 'chatPipe', 'ProcessChatRequestBuffer', 'isChatRequestPending'],
   events: [],
   icon: 'assets/img/remix-logo-blue.png',
   description: 'RemixAI provides AI services to Remix IDE.',
@@ -38,15 +37,16 @@ export class RemixAIPlugin extends ViewPlugin {
   remoteInferencer:RemoteInferencer = null
   isInferencing: boolean = false
   chatRequestBuffer: chatRequestBufferT<any> = null
-  agent: CodeExplainAgent
+  codeExpAgent: CodeExplainAgent
+  securityAgent: SecurityAgent
   useRemoteInferencer:boolean = false
   dispatch: any
 
   constructor(inDesktop:boolean) {
     super(profile)
     this.isOnDesktop = inDesktop
-    this.agent = new CodeExplainAgent(this)
-    // user machine dont use resource for remote inferencing
+    this.codeExpAgent = new CodeExplainAgent(this)
+    // user machine dont use ressource for remote inferencing
   }
 
   onActivation(): void {
@@ -62,6 +62,8 @@ export class RemixAIPlugin extends ViewPlugin {
       this.useRemoteInferencer = true
       this.initialize()
     }
+
+    this.securityAgent = new SecurityAgent(this)
   }
 
   async initialize(model1?:IModel, model2?:IModel, remoteModel?:IRemoteModel, useRemote?:boolean){
@@ -97,11 +99,6 @@ export class RemixAIPlugin extends ViewPlugin {
   }
 
   async code_generation(prompt: string): Promise<any> {
-    if (this.isInferencing) {
-      this.call('terminal', 'log', { type: 'aitypewriterwarning', value: "RemixAI is already busy!" })
-      return
-    }
-
     if (this.isOnDesktop && !this.useRemoteInferencer) {
       return await this.call(this.remixDesktopPluginName, 'code_generation', prompt)
     } else {
@@ -118,17 +115,8 @@ export class RemixAIPlugin extends ViewPlugin {
   }
 
   async solidity_answer(prompt: string, params: IParams=GenerationParams): Promise<any> {
-    if (this.isInferencing) {
-      this.call('terminal', 'log', { type: 'aitypewriterwarning', value: "RemixAI is already busy!" })
-      return
-    }
-    if (prompt.trimStart().startsWith('gpt') || prompt.trimStart().startsWith('sol-gpt')) {
-      params.terminal_output = true
-      params.stream_result = false
-      params.return_stream_response = false
-    }
+    const newPrompt = await this.codeExpAgent.chatCommand(prompt)
 
-    const newPrompt = await this.agent.chatCommand(prompt)
     let result
     if (this.isOnDesktop && !this.useRemoteInferencer) {
       result = await this.call(this.remixDesktopPluginName, 'solidity_answer', newPrompt)
@@ -142,11 +130,6 @@ export class RemixAIPlugin extends ViewPlugin {
   }
 
   async code_explaining(prompt: string, context: string, params: IParams=GenerationParams): Promise<any> {
-    if (this.isInferencing) {
-      this.call('terminal', 'log', { type: 'aitypewriterwarning', value: "RemixAI is already busy!" })
-      return
-    }
-
     let result
     if (this.isOnDesktop && !this.useRemoteInferencer) {
       result = await this.call(this.remixDesktopPluginName, 'code_explaining', prompt, context, params)
@@ -159,11 +142,6 @@ export class RemixAIPlugin extends ViewPlugin {
   }
 
   async error_explaining(prompt: string, context: string="", params: IParams=GenerationParams): Promise<any> {
-    if (this.isInferencing) {
-      this.call('terminal', 'log', { type: 'aitypewriterwarning', value: "RemixAI is already busy!" })
-      return
-    }
-
     let result
     if (this.isOnDesktop && !this.useRemoteInferencer) {
       result = await this.call(this.remixDesktopPluginName, 'error_explaining', prompt)
@@ -174,6 +152,22 @@ export class RemixAIPlugin extends ViewPlugin {
     return result
   }
 
+  async vulnerability_check(prompt: string, params: IParams=GenerationParams): Promise<any> {
+    let result
+    if (this.isOnDesktop && !this.useRemoteInferencer) {
+      result = await this.call(this.remixDesktopPluginName, 'vulnerability_check', prompt)
+
+    } else {
+      result = await this.remoteInferencer.vulnerability_check(prompt, params)
+    }
+    if (result && params.terminal_output) this.call('terminal', 'log', { type: 'aitypewriterwarning', value: result })
+    return result
+  }
+
+  getVulnerabilityReport(file: string): any {
+    return this.securityAgent.getReport(file)
+  }
+
   async code_insertion(msg_pfx: string, msg_sfx: string): Promise<any> {
     if (this.isOnDesktop && !this.useRemoteInferencer) {
       return await this.call(this.remixDesktopPluginName, 'code_insertion', msg_pfx, msg_sfx)
@@ -194,11 +188,12 @@ export class RemixAIPlugin extends ViewPlugin {
         if (fn === "code_explaining") ChatApi.composer.send("Explain the current code")
         else if (fn === "error_explaining") ChatApi.composer.send("Explain the error")
         else if (fn === "solidity_answer") ChatApi.composer.send("Answer the following question")
-        else console.log("chatRequestBuffer is not empty. First process the last request.")
+        else if (fn === "vulnerability_check") ChatApi.composer.send("Is there any vulnerability in the pasted code?")
+        else console.log("chatRequestBuffer function name not recognized.")
       }
     }
     else {
-      console.log("chatRequestBuffer is not empty. First process the last request.")
+      console.log("chatRequestBuffer is not empty. First process the last request.", this.chatRequestBuffer)
     }
     _paq.push(['trackEvent', 'ai', 'remixAI_chat', 'askFromTerminal'])
   }
diff --git a/apps/remix-ide/src/app/tabs/analysis-tab.js b/apps/remix-ide/src/app/tabs/analysis-tab.js
index 77080b1770..90d0900fb8 100644
--- a/apps/remix-ide/src/app/tabs/analysis-tab.js
+++ b/apps/remix-ide/src/app/tabs/analysis-tab.js
@@ -22,7 +22,7 @@ const profile = {
   maintainedBy: 'Remix'
 }
 
-class AnalysisTab extends ViewPlugin {
+export default class AnalysisTab extends ViewPlugin {
   constructor () {
     super(profile)
     this.event = new EventManager()
diff --git a/apps/remix-ide/src/app/tabs/compile-tab.js b/apps/remix-ide/src/app/tabs/compile-tab.js
index 70f0d498a7..eed9cb6818 100644
--- a/apps/remix-ide/src/app/tabs/compile-tab.js
+++ b/apps/remix-ide/src/app/tabs/compile-tab.js
@@ -28,7 +28,7 @@ const profile = {
 // - events: ['compilationFinished'],
 // - methods: ['getCompilationResult']
 
-class CompileTab extends CompilerApiMixin(ViewPlugin) { // implements ICompilerApi
+export default class CompileTab extends CompilerApiMixin(ViewPlugin) { // implements ICompilerApi
   constructor (config, fileManager) {
     super(profile)
     this.fileManager = fileManager
diff --git a/apps/remix-ide/src/app/tabs/debugger-tab.js b/apps/remix-ide/src/app/tabs/debugger-tab.js
index 9560713ffe..0e30f19b2f 100644
--- a/apps/remix-ide/src/app/tabs/debugger-tab.js
+++ b/apps/remix-ide/src/app/tabs/debugger-tab.js
@@ -22,7 +22,7 @@ const profile = {
   maintainedBy: 'Remix'
 }
 
-export class DebuggerTab extends DebuggerApiMixin(ViewPlugin) {
+export default class DebuggerTab extends DebuggerApiMixin(ViewPlugin) {
   constructor () {
     super(profile)
     this.el = document.createElement('div')
diff --git a/apps/remix-ide/src/app/tabs/locales/en/editor.json b/apps/remix-ide/src/app/tabs/locales/en/editor.json
index 6f0f367555..b5a06a18ad 100644
--- a/apps/remix-ide/src/app/tabs/locales/en/editor.json
+++ b/apps/remix-ide/src/app/tabs/locales/en/editor.json
@@ -28,6 +28,7 @@
   "editor.explainFunctionByAI": "```\n{content}\n```\nExplain the function {currentFunction}",
   "editor.explainFunctionByAISol": "```\n{content}\n```\nExplain the function {currentFunction}",
   "editor.ExplainPipeMessage": "```\n {content}\n```\nExplain the snipped above",
+  "editor.PastedCodeSafety": "```\n {content}\n```\n\nReply in a short manner: Does this code contain major security vulnerabilities leading to a scam or loss of funds?",
   "editor.executeFreeFunction": "Run a free function",
   "editor.executeFreeFunction2": "Run the free function \"{name}\"",
   "editor.toastText1": "This can only execute free function",
diff --git a/apps/remix-ide/src/app/tabs/settings-tab.tsx b/apps/remix-ide/src/app/tabs/settings-tab.tsx
index 08557e3a31..8a5ac39a94 100644
--- a/apps/remix-ide/src/app/tabs/settings-tab.tsx
+++ b/apps/remix-ide/src/app/tabs/settings-tab.tsx
@@ -27,7 +27,7 @@ const profile = {
   maintainedBy: 'Remix'
 }
 
-module.exports = class SettingsTab extends ViewPlugin {
+export default class SettingsTab extends ViewPlugin {
   config: any = {}
   editor: any
   private _deps: {
diff --git a/apps/remix-ide/src/app/tabs/test-tab.js b/apps/remix-ide/src/app/tabs/test-tab.js
index 6a317cdacd..8d695366fd 100644
--- a/apps/remix-ide/src/app/tabs/test-tab.js
+++ b/apps/remix-ide/src/app/tabs/test-tab.js
@@ -22,7 +22,7 @@ const profile = {
   maintainedBy: 'Remix'
 }
 
-module.exports = class TestTab extends ViewPlugin {
+export default class TestTab extends ViewPlugin {
   constructor (fileManager, offsetToLineColumnConverter, filePanel, compileTab, appManager, contentImport) {
     super(profile)
     this.compileTab = compileTab
diff --git a/apps/remixdesktop/src/lib/InferenceServerManager.ts b/apps/remixdesktop/src/lib/InferenceServerManager.ts
index 4587e822db..fa928f2672 100644
--- a/apps/remixdesktop/src/lib/InferenceServerManager.ts
+++ b/apps/remixdesktop/src/lib/InferenceServerManager.ts
@@ -6,7 +6,7 @@ import { EventEmitter } from 'events';
 import { ICompletions, IModel, IParams, InsertionParams,
   CompletionParams, GenerationParams, ModelType, AIRequestType,
   IStreamResponse, ChatHistory, downloadLatestReleaseExecutable,
-  buildSolgptPromt } from "@remix/remix-ai-core"
+  buildSolgptPrompt } from "@remix/remix-ai-core"
 import { platform } from 'os';
 
 class ServerStatusTimer {
diff --git a/apps/walletconnect/webpack.config.js b/apps/walletconnect/webpack.config.js
index c1ae621262..8da8a91246 100644
--- a/apps/walletconnect/webpack.config.js
+++ b/apps/walletconnect/webpack.config.js
@@ -46,7 +46,7 @@ module.exports = composePlugins(withNx(), (config) => {
       process: 'process/browser'
     })
   )
-
+  console.log(process.env.WALLET_CONNECT_PROJECT_ID)
   // set the define plugin to load the WALLET_CONNECT_PROJECT_ID
   config.plugins.push(
     new webpack.DefinePlugin({
diff --git a/libs/remix-ai-core/src/agents/securityAgent.ts b/libs/remix-ai-core/src/agents/securityAgent.ts
index 9af6723f0e..f55aaa7f2b 100644
--- a/libs/remix-ai-core/src/agents/securityAgent.ts
+++ b/libs/remix-ai-core/src/agents/securityAgent.ts
@@ -1,28 +1,188 @@
 // security checks
 import * as fs from 'fs';
 
-class SecurityAgent {
-  private codebase: string[]; // list of codebase files
+interface SecurityReport {
+  compiled: boolean;
+  vulnerabilities: string[];
+  isNotSafe: string;
+  fileName: string;
+  reportTimestamp: string;
+  recommendations: string[];
+  fileModifiedSinceLastReport: boolean;
+  hasPastedCode: boolean;
+}
+
+class WorkspaceWatcher {
+  private intervalId: NodeJS.Timeout | null = null;
+  public interval: number;
+  private task: () => void;
+
+  constructor(task: () => void, interval: number) {
+    this.task = task;
+    this.interval = interval;
+  }
+
+  start(): void {
+    if (this.intervalId === null) {
+      this.intervalId = setInterval(() => {
+        this.task();
+      }, this.interval);
+    }
+  }
+
+  stop(): void {
+    if (this.intervalId !== null) {
+      clearInterval(this.intervalId);
+      this.intervalId = null;
+    }
+  }
+
+  isRunning(): boolean {
+    return this.intervalId !== null;
+  }
+}
+
+export class SecurityAgent {
   public currentFile: string;
+  public openedFiles: any;
+  private basePlugin: any;
+  private watcher: WorkspaceWatcher;
+  public reports: SecurityReport[] = [];
+
+  constructor(plugin) {
+    this.basePlugin = plugin;
+
+    this.basePlugin.on('fileManager', 'fileAdded', (path) => { });
+    this.basePlugin.on('fileManager', 'fileChanged', (path) => { //this.modifiedFile(path)
+    });
+
+    this.basePlugin.on('fileManager', 'fileRemoved', (path) => { this.removeFileFromReport(path) });
+    this.basePlugin.on('fileManager', 'fileRenamed', (oldName, newName) => {
+      this.removeFileFromReport(oldName);
+      this.addFileToReport(newName);
+    });
+
+    this.basePlugin.on('solidity', 'compilationFinished', async (fileName, source, languageVersion, data) => { this.onCompilationFinished(fileName) });
+    this.basePlugin.on('vyper', 'compilationFinished', async (fileName, source, languageVersion, data) => { this.onCompilationFinished(fileName) });
+    this.basePlugin.on('hardhat', 'compilationFinished', async (fileName, source, languageVersion, data) => { this.onCompilationFinished(fileName) });
+    this.basePlugin.on('foundry', 'compilationFinished', async (fileName, source, languageVersion, data) => { this.onCompilationFinished(fileName) });
+
+    this.watcher = new WorkspaceWatcher(async () => {
+      try {
+        this.currentFile = await this.basePlugin.call('fileManager', 'getCurrentFile');
+        this.openedFiles = await this.basePlugin.call('fileManager', 'getOpenedFiles');
+
+        Object.keys(this.openedFiles).forEach(key => {
+          this.addFileToReport(this.openedFiles[key]);
+        });
+      } catch (error) {
+        // no file selected or opened currently
+      }
+    }, 10000);
+    this.watcher.start();
+  }
+
+  addFileToReport(file: string): void {
+    const report = this.reports.find((r) => r.fileName === file);
+    if (report) {
+      // nothing to do
+    } else {
+      this.reports.push({
+        compiled: false,
+        isNotSafe: 'No',
+        vulnerabilities: [],
+        fileName: file,
+        reportTimestamp: null,
+        recommendations: [],
+        fileModifiedSinceLastReport: false,
+        hasPastedCode: false
+      });
+    }
 
-  constructor(codebasePath: string) {
-    // git or fs
-    this.codebase = this.loadCodebase(codebasePath);
   }
 
-  private loadCodebase(path: string): string[] {
-    const files = fs.readdirSync(path);
-    return files
-      .filter(file => file.endsWith('.ts'))
-      .flatMap(file => fs.readFileSync(`${path}/${file}`, 'utf-8').split('\n'));
+  async onCompilationFinished(file: string) {
+    let report = this.reports.find((r) => r.fileName === file);
+    if (report) {
+      report.compiled = true;
+      report.fileModifiedSinceLastReport = false;
+    } else {
+      report = {
+        compiled: true,
+        isNotSafe: 'No',
+        vulnerabilities: [],
+        fileName: file,
+        reportTimestamp: null,
+        recommendations: [],
+        fileModifiedSinceLastReport: false,
+        hasPastedCode: false
+      }
+      this.reports.push(report);
+    }
+
+    try {
+      this.processFile(file);
+      console.log('Checking for vulnerabilities after compilation', this.reports);
+    } catch (error) {
+      console.error('Error checking for vulnerabilities after compilation: ', error);
+    }
+
+    // check for security vulnerabilities
   }
 
-  public update(currentFile, lineNumber){
+  removeFileFromReport(file: string): void {
+    const index = this.reports.findIndex((r) => r.fileName === file);
+    if (index !== -1) {
+      this.reports.splice(index, 1);
+    }
+  }
+
+  modifiedFile(file: string): void {
+    const report = this.reports.find((r) => r.fileName === file);
+    if (report) {
+      report.fileModifiedSinceLastReport = true;
+    }
+  }
+
+  async processFile(file: string) {
+    try {
+      const report = this.reports.find((r) => r.fileName === file);
+      if (report) { }
+      else {
+        this.reports.push({
+          compiled: false,
+          isNotSafe: 'No',
+          vulnerabilities: [],
+          fileName: file,
+          reportTimestamp: null,
+          recommendations: [],
+          fileModifiedSinceLastReport: false,
+          hasPastedCode: false
+        });
+      }
+
+      if (!report.reportTimestamp || report.fileModifiedSinceLastReport) {
+        const content = await this.basePlugin.call('fileManager', 'getFile', file);
+        const prompt = "```\n" + content + "\n```\n\nReply in a short manner: Does this code contain major security vulnerabilities leading to a scam or loss of funds?"
+
+        let result = await this.basePlugin.call('remixAI', 'vulnerability_check', prompt)
+        result = JSON.parse(result);
+        report.vulnerabilities = result.Reason;
+        report.recommendations = result.Suggestion;
+        report.isNotSafe = result.Answer;
+        report.reportTimestamp = new Date().toISOString();
+      }
+
+    } catch (error) {
+      console.error('Error processing file: ', error);
+    }
+  }
 
+  getReport(file: string): SecurityReport {
+    return this.reports.find((r) => r.fileName === file);
   }
 
   public getRecommendations(currentLine: string, numSuggestions: number = 3): string[] {
-    // process the codebase highlighting security vulnerabilities and deliver recommendations
     const suggestions: string[] = [];
     return suggestions;
   }
diff --git a/libs/remix-ai-core/src/helpers/streamHandler.ts b/libs/remix-ai-core/src/helpers/streamHandler.ts
index d2e18624b6..5d58519568 100644
--- a/libs/remix-ai-core/src/helpers/streamHandler.ts
+++ b/libs/remix-ai-core/src/helpers/streamHandler.ts
@@ -46,6 +46,7 @@ export const HandleStreamResponse = async (streamResponse,
       }
       catch (error) {
         console.error('Error parsing JSON:', error);
+        return { 'generateText': 'Try again!', 'isGenerating': false }
       }
     }
     if (done_cb) {
@@ -54,7 +55,7 @@ export const HandleStreamResponse = async (streamResponse,
   }
   catch (error) {
     console.error('Error parsing JSON:', error);
-    return { 'generateText': '', 'isGenerating': false }
+    return { 'generateText': 'Try again!', 'isGenerating': false }
   }
 }
 
diff --git a/libs/remix-ai-core/src/index.ts b/libs/remix-ai-core/src/index.ts
index fe54a57f2f..130f040c48 100644
--- a/libs/remix-ai-core/src/index.ts
+++ b/libs/remix-ai-core/src/index.ts
@@ -6,7 +6,7 @@ import { IModel, IModelResponse, IModelRequest, InferenceModel, ICompletions,
 import { ModelType } from './types/constants'
 import { DefaultModels, InsertionParams, CompletionParams, GenerationParams } from './types/models'
 import { getCompletionPrompt, getInsertionPrompt } from './prompts/completionPrompts'
-import { buildSolgptPromt, PromptBuilder } from './prompts/promptBuilder'
+import { buildSolgptPrompt, PromptBuilder } from './prompts/promptBuilder'
 import { RemoteInferencer } from './inferencers/remote/remoteInference'
 import { ChatHistory } from './prompts/chat'
 import { downloadLatestReleaseExecutable } from './helpers/inferenceServerReleases'
@@ -14,11 +14,12 @@ import { downloadLatestReleaseExecutable } from './helpers/inferenceServerReleas
 export {
   IModel, IModelResponse, IModelRequest, InferenceModel,
   ModelType, DefaultModels, ICompletions, IParams, IRemoteModel,
-  getCompletionPrompt, getInsertionPrompt, IStreamResponse, buildSolgptPromt,
+  getCompletionPrompt, getInsertionPrompt, IStreamResponse, buildSolgptPrompt,
   RemoteInferencer, InsertionParams, CompletionParams, GenerationParams,
   ChatEntry, AIRequestType, RemoteBackendOPModel, ChatHistory, downloadLatestReleaseExecutable
 }
 
 export * from './types/types'
 export * from './helpers/streamHandler'
-export * from './agents/codeExplainAgent'
\ No newline at end of file
+export * from './agents/codeExplainAgent'
+export * from './agents/securityAgent'
\ No newline at end of file
diff --git a/libs/remix-ai-core/src/inferencers/remote/remoteInference.ts b/libs/remix-ai-core/src/inferencers/remote/remoteInference.ts
index c6ad381618..dbee3e37ab 100644
--- a/libs/remix-ai-core/src/inferencers/remote/remoteInference.ts
+++ b/libs/remix-ai-core/src/inferencers/remote/remoteInference.ts
@@ -1,6 +1,6 @@
 import { ICompletions, IParams, AIRequestType, RemoteBackendOPModel, JsonStreamParser } from "../../types/types";
 import { GenerationParams, CompletionParams, InsertionParams } from "../../types/models";
-import { buildSolgptPromt } from "../../prompts/promptBuilder";
+import { buildSolgptPrompt } from "../../prompts/promptBuilder";
 import EventEmitter from "events";
 import { ChatHistory } from "../../prompts/chat";
 import axios from 'axios';
@@ -127,7 +127,7 @@ export class RemoteInferencer implements ICompletions {
   }
 
   async solidity_answer(prompt, options:IParams=GenerationParams): Promise<any> {
-    const main_prompt = buildSolgptPromt(prompt, this.model_op)
+    const main_prompt = buildSolgptPrompt(prompt, this.model_op)
     const payload = { 'prompt': main_prompt, "endpoint":"solidity_answer", ...options }
     if (options.stream_result) return this._streamInferenceRequest(payload, AIRequestType.GENERAL)
     else return this._makeRequest(payload, AIRequestType.GENERAL)
diff --git a/libs/remix-ai-core/src/prompts/promptBuilder.ts b/libs/remix-ai-core/src/prompts/promptBuilder.ts
index fea867e36c..e22088bc6a 100644
--- a/libs/remix-ai-core/src/prompts/promptBuilder.ts
+++ b/libs/remix-ai-core/src/prompts/promptBuilder.ts
@@ -7,7 +7,7 @@ export const PromptBuilder = (inst, answr, modelop) => {
   if (modelop === RemoteBackendOPModel.MISTRAL) return ""
 }
 
-export const buildSolgptPromt = (userPrompt:string, modelOP:RemoteBackendOPModel) => {
+export const buildSolgptPrompt = (userPrompt:string, modelOP:RemoteBackendOPModel) => {
   if (modelOP === undefined) {
     console.log('WARNING: modelOP is undefined. Provide a valid model OP for chat history')
     return userPrompt
diff --git a/libs/remix-api/src/lib/plugins/remixAIDesktop-api.ts b/libs/remix-api/src/lib/plugins/remixAIDesktop-api.ts
index 91b13c4bac..9e4cdd4716 100644
--- a/libs/remix-api/src/lib/plugins/remixAIDesktop-api.ts
+++ b/libs/remix-api/src/lib/plugins/remixAIDesktop-api.ts
@@ -10,7 +10,7 @@ export interface IRemixAID {
 
   } & StatusEvents,
   methods: {
-    code_completion(context: string): Promise<string> 
+    code_completion(context: string): Promise<string>
     code_insertion(msg_pfx: string, msg_sfx: string): Promise<string>,
     code_generation(prompt: string): Promise<string | null>,
     code_explaining(code: string, context?: string): Promise<string | null>,
diff --git a/libs/remix-lib/src/execution/txRunner.ts b/libs/remix-lib/src/execution/txRunner.ts
index ee2ee5ed2d..e875ff6713 100644
--- a/libs/remix-lib/src/execution/txRunner.ts
+++ b/libs/remix-lib/src/execution/txRunner.ts
@@ -16,7 +16,7 @@ export type Transaction = {
 export class TxRunner {
   event
   pendingTxs
-  queusTxs
+  queueTxs
   opt
   internalRunner
   constructor (internalRunner, opt) {
@@ -25,7 +25,7 @@ export class TxRunner {
     this.event = new EventManager()
 
     this.pendingTxs = {}
-    this.queusTxs = []
+    this.queueTxs = []
   }
 
   rawRun (args: Transaction, confirmationCb, gasEstimationForceSend, promptCb, cb) {
@@ -42,14 +42,14 @@ export class TxRunner {
 
 function run (self, tx: Transaction, stamp, confirmationCb, gasEstimationForceSend = null, promptCb = null, callback = null) {
   if (Object.keys(self.pendingTxs).length) {
-    return self.queusTxs.push({ tx, stamp, confirmationCb, gasEstimationForceSend, promptCb, callback })
+    return self.queueTxs.push({ tx, stamp, confirmationCb, gasEstimationForceSend, promptCb, callback })
   }
   self.pendingTxs[stamp] = tx
   self.execute(tx, confirmationCb, gasEstimationForceSend, promptCb, function (error, result) {
     delete self.pendingTxs[stamp]
     if (callback && typeof callback === 'function') callback(error, result)
-    if (self.queusTxs.length) {
-      const next = self.queusTxs.pop()
+    if (self.queueTxs.length) {
+      const next = self.queueTxs.pop()
       run(self, next.tx, next.stamp, next.confirmationCb, next.gasEstimationForceSend, next.promptCb, next.callback)
     }
   })
diff --git a/libs/remix-lib/src/execution/txRunnerVM.ts b/libs/remix-lib/src/execution/txRunnerVM.ts
index 12bfd3636e..f326c9dc8e 100644
--- a/libs/remix-lib/src/execution/txRunnerVM.ts
+++ b/libs/remix-lib/src/execution/txRunnerVM.ts
@@ -24,7 +24,7 @@ export class TxRunnerVM {
   blockNumber
   pendingTxs
   vmaccounts
-  queusTxs
+  queueTxs
   blocks: Uint8Array[]
   logsManager
   commonContext
@@ -41,7 +41,7 @@ export class TxRunnerVM {
     this.commonContext = this.getVMObject().common
     this.pendingTxs = {}
     this.vmaccounts = vmaccounts
-    this.queusTxs = []
+    this.queueTxs = []
     /*
       txHash is generated using the nonce,
       in order to have unique transaction hash, we need to keep using different nonce (in case of a call)
diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts
index 674d069f1c..5f15022b10 100644
--- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts
+++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts
@@ -9,7 +9,7 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli
   props: EditorUIProps
   monaco: any
   completionEnabled: boolean
-  task: string
+  task: string = 'code_completion'
   currentCompletion: any
   private lastRequestTime: number = 0;
   private readonly minRequestInterval: number = 200;
@@ -60,13 +60,6 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli
       endColumn: getTextAtLine(model.getLineCount()).length + 1,
     });
 
-    if (!word.endsWith(' ') &&
-      !word.endsWith('.') &&
-      !word.endsWith('"') &&
-      !word.endsWith('(')) {
-      return;
-    }
-
     try {
       const split = word.split('\n')
       if (split.length < 2) return
diff --git a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx
index c9f2c37da7..e330efb78a 100644
--- a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx
+++ b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx
@@ -2,7 +2,7 @@ import React, { useState, useRef, useEffect, useReducer } from 'react' // eslint
 import { FormattedMessage, useIntl } from 'react-intl'
 import { isArray } from 'lodash'
 import Editor, { DiffEditor, loader, Monaco } from '@monaco-editor/react'
-import { AlertModal } from '@remix-ui/app'
+import { AppModal } from '@remix-ui/app'
 import { ConsoleLogs, QueryParams } from '@remix-project/remix-lib'
 import { reducerActions, reducerListener, initialState } from './actions/editor'
 import { solidityTokensProvider, solidityLanguageConfig } from './syntaxes/solidity'
@@ -664,11 +664,26 @@ export const EditorUI = (props: EditorUIProps) => {
       }
     })
 
-    editor.onDidPaste((e) => {
+    editor.onDidPaste(async (e) => {
       if (!pasteCodeRef.current && e && e.range && e.range.startLineNumber >= 0 && e.range.endLineNumber >= 0 && e.range.endLineNumber - e.range.startLineNumber > 10) {
-        const modalContent: AlertModal = {
+        // get the file name
+        const pastedCode = editor.getModel().getValueInRange(e.range)
+        const pastedCodePrompt = intl.formatMessage({ id: 'editor.PastedCodeSafety' }, { content:pastedCode })
+
+        const modalContent: AppModal = {
           id: 'newCodePasted',
-          title: intl.formatMessage({ id: 'editor.title1' }),
+          title: "New code pasted",
+          okLabel: 'Ask RemixAI',
+          cancelLabel: 'Close',
+          cancelFn: () => {},
+          okFn: async () => {
+            await props.plugin.call('popupPanel', 'showPopupPanel', true)
+            setTimeout(async () => {
+              props.plugin.call('remixAI', 'chatPipe', 'vulnerability_check', pastedCodePrompt)
+            }, 500)
+            // add matamo event
+            _paq.push(['trackEvent', 'ai', 'remixAI', 'vulnerability_check_pasted_code'])
+          },
           message: (
             <div>
               {' '}
@@ -699,10 +714,9 @@ export const EditorUI = (props: EditorUIProps) => {
                 </div>
               </div>
             </div>
-          ),
+          )
         }
-        props.plugin.call('notification', 'alert', modalContent)
-        pasteCodeRef.current = true
+        props.plugin.call('notification', 'modal', modalContent)
         _paq.push(['trackEvent', 'editor', 'onDidPaste', 'more_than_10_lines'])
       }
     })
diff --git a/libs/remix-ui/editor/src/lib/syntaxes/solidity.ts b/libs/remix-ui/editor/src/lib/syntaxes/solidity.ts
index fda352456e..67da59e597 100644
--- a/libs/remix-ui/editor/src/lib/syntaxes/solidity.ts
+++ b/libs/remix-ui/editor/src/lib/syntaxes/solidity.ts
@@ -1236,7 +1236,7 @@ export const solidityTokensProvider = {
     'abstract',
     'payable',
     'nonpayable',
-    'constants',
+    'constant',
     'immutable',
     'assert',
     'require',
diff --git a/libs/remix-ui/home-tab/src/lib/components/types/carouselTypes.ts b/libs/remix-ui/home-tab/src/lib/components/types/carouselTypes.ts
index d65054171d..0f43f1a225 100644
--- a/libs/remix-ui/home-tab/src/lib/components/types/carouselTypes.ts
+++ b/libs/remix-ui/home-tab/src/lib/components/types/carouselTypes.ts
@@ -34,7 +34,7 @@ export interface CarouselProps {
   beforeChange?: (nextSlide: number, state: StateCallBack) => void; // Change callback before sliding every time. `(previousSlide, currentState) => ...`
   sliderClass?: string; // Use this to style your own track list.
   itemClass?: string; // Use this to style your own Carousel item. For example add padding-left and padding-right
-  itemAriaLabel?: string; // Use this to add your own Carousel item aria-label.if it is not defined the child aria label will be applied if the child dont have one than a default empty string will be applied
+  itemAriaLabel?: string; // Use this to add your own Carousel item aria-label.if it is not defined the child aria label will be applied if the child doesn't have one, then a default empty string will be applied
   containerClass?: string; // Use this to style the whole container. For example add padding to allow the "dots" or "arrows" to go to other places without being overflown.
   className?: string; // Use this to style the whole container with styled-components
   dotListClass?: string; // Use this to style the dot list.
diff --git a/libs/remix-ui/plugin-manager/src/types.d.ts b/libs/remix-ui/plugin-manager/src/types.d.ts
index cfe333c636..2e16627e8a 100644
--- a/libs/remix-ui/plugin-manager/src/types.d.ts
+++ b/libs/remix-ui/plugin-manager/src/types.d.ts
@@ -34,14 +34,11 @@ export class RemixAppManager extends PluginManager {
   event: EventEmitter
   pluginsDirectory: string
   pluginLoader: PluginLoader // eslint-disable-line no-use-before-define
-  permissionHandler: PermissionHandler
   getAll(): import('@remixproject/plugin-utils').Profile<any>[]
   getIds(): string[]
   isDependent(name: any): any
   isRequired(name: any): any
   registeredPlugins(): Promise<any>
-  turnPluginOn(name: string | string[])
-  turnPluginOff(name: string)
 }
 
 export class PluginManagerSettings {
@@ -67,7 +64,7 @@ export type PluginPermissions = {
   }
 }
 
-export class PluginManagerComponent extends ViewPlugin extends Plugin implements PluginBase {
+export class PluginManagerComponent extends ViewPlugin implements PluginBase {
   constructor(appManager: RemixAppManager, engine: Engine)
   appManager: RemixAppManager
   pluginSettings: PluginManagerSettings
@@ -154,14 +151,6 @@ declare class PluginLoader {
   set(plugin: any, actives: any): void
   get(): any
 }
-// eslint-disable-next-line no-redeclare
-export type PluginManagerSettings = {
-  openDialog: () => void
-  onValidation: () => void
-  clearPermission: (from: any, to: any, method: any) => void
-  settings: () => HTMLElement
-  render: () => HTMLElement
-}
 
 export interface DefaultLocalPlugin extends Profile {
   name: string
@@ -198,14 +187,5 @@ export type PluginManagerProfile = Profile & {
   type: 'iframe' | 'ws'
   hash: string
 }
-// eslint-disable-next-line no-redeclare
-export type LocalPlugin = {
-  create: () => Profile
-  updateName: (target: string) => void
-  updateDisplayName: (displayName: string) => void
-  updateProfile: (key: string, e: Event) => void
-  updateMethods: (target: any) => void
-  form: () => HTMLElement
-}
 
 export { }
diff --git a/libs/remix-ui/run-tab/src/lib/actions/deploy.ts b/libs/remix-ui/run-tab/src/lib/actions/deploy.ts
index ed66b6128b..37fbca3d27 100644
--- a/libs/remix-ui/run-tab/src/lib/actions/deploy.ts
+++ b/libs/remix-ui/run-tab/src/lib/actions/deploy.ts
@@ -22,7 +22,7 @@ const txHelper = remixLib.execution.txHelper
 const txFormat = remixLib.execution.txFormat
 
 const loadContractFromAddress = (plugin: RunTab, address, confirmCb, cb) => {
-  if (/.(.abi)$/.exec(plugin.config.get('currentFile'))) {
+  if (/\.(abi)$/.exec(plugin.config.get('currentFile'))) {
     confirmCb(() => {
       let abi
       try {
@@ -42,7 +42,7 @@ const loadContractFromAddress = (plugin: RunTab, address, confirmCb, cb) => {
 
 export const getSelectedContract = (contractName: string, compiler: CompilerAbstractType): ContractData => {
   if (!contractName) return null
-  // const compiler = plugin.compilersArtefacts[compilerAtributeName]
+  // const compiler = plugin.compilersArtefacts[compilerAttributeName]
 
   if (!compiler) return null
 
diff --git a/libs/remix-ui/run-tab/src/lib/run-tab.tsx b/libs/remix-ui/run-tab/src/lib/run-tab.tsx
index c6eb716af6..d352347eb9 100644
--- a/libs/remix-ui/run-tab/src/lib/run-tab.tsx
+++ b/libs/remix-ui/run-tab/src/lib/run-tab.tsx
@@ -235,6 +235,16 @@ export function RunTabUI(props: RunTabProps) {
     }
   }, [runTab.popup])
 
+  useEffect(() => {
+    if (runTab.selectExEnv.includes('injected') &&
+      Object.entries(runTab.accounts.loadedAccounts).length === 0 &&
+    runTab.accounts.selectedAccount.length > 0) {
+      // switch to vm-cancum because no account is loaded from injected provider
+      const context = plugin.blockchain.defaultPinnedProviders[0] // vm-cancun
+      setExecutionEnvironment({ context, fork: '' })
+    }
+  }, [runTab.accounts.loadedAccounts])
+
   const setCheckIpfs = (value: boolean) => {
     dispatch(setIpfsCheckedState(value))
   }
diff --git a/libs/remix-ui/run-tab/src/lib/types/blockchain.d.ts b/libs/remix-ui/run-tab/src/lib/types/blockchain.d.ts
index 428c782a8e..d47d0d89f7 100644
--- a/libs/remix-ui/run-tab/src/lib/types/blockchain.d.ts
+++ b/libs/remix-ui/run-tab/src/lib/types/blockchain.d.ts
@@ -25,6 +25,7 @@ export class Blockchain extends Plugin<any, any> {
     };
   setupProviders(): void;
   providers: any;
+  defaultPinnedProviders: string[];
   getCurrentProvider(): any;
   /** Return the list of accounts */
   getAccounts(cb?: any): any;
diff --git a/libs/remix-ui/search/src/lib/components/results/ResultSummary.tsx b/libs/remix-ui/search/src/lib/components/results/ResultSummary.tsx
index 2878b491c6..cb1e28495a 100644
--- a/libs/remix-ui/search/src/lib/components/results/ResultSummary.tsx
+++ b/libs/remix-ui/search/src/lib/components/results/ResultSummary.tsx
@@ -13,10 +13,10 @@ interface ResultSummaryProps {
 
 export const ResultSummary = (props: ResultSummaryProps) => {
   const intl = useIntl()
-  const { hightLightInPath, replaceText, state } = useContext(SearchContext)
+  const { highlightInPath, replaceText, state } = useContext(SearchContext)
   const { modal } = useDialogDispatchers()
   const selectLine = async (line: SearchResultLineLine) => {
-    await hightLightInPath(props.searchResult, line)
+    await highlightInPath(props.searchResult, line)
   }
 
   const confirmReplace = async (line: SearchResultLineLine) => {
diff --git a/libs/remix-ui/search/src/lib/context/context.tsx b/libs/remix-ui/search/src/lib/context/context.tsx
index 336955c744..e0d7933042 100644
--- a/libs/remix-ui/search/src/lib/context/context.tsx
+++ b/libs/remix-ui/search/src/lib/context/context.tsx
@@ -19,7 +19,7 @@ export interface SearchingStateInterface {
   setWholeWord: (value: boolean) => void
   setSearchResults: (value: SearchResult[]) => void
   findText: (path: string) => Promise<SearchResultLine[]>
-  hightLightInPath: (result: SearchResult, line: SearchResultLineLine) => void
+  highlightInPath: (result: SearchResult, line: SearchResultLineLine) => void
   replaceText: (result: SearchResult, line: SearchResultLineLine) => Promise<void>
   reloadFile: (file: string) => void
   toggleCaseSensitive: () => void
@@ -194,7 +194,7 @@ export const SearchProvider = ({ children = [], reducer = SearchReducer, initial
         // do nothing
       }
     },
-    hightLightInPath: async (result: SearchResult, line: SearchResultLineLine) => {
+    highlightInPath: async (result: SearchResult, line: SearchResultLineLine) => {
       await plugin.call('editor', 'discardHighlight')
       await plugin.call('editor', 'highlight', line.position, result.path)
       await plugin.call('editor', 'revealRange', line.position.start.line, line.position.start.column, line.position.end.line, line.position.end.column)
diff --git a/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx b/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx
index d9f9b44955..0d279961a3 100644
--- a/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx
+++ b/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx
@@ -88,7 +88,12 @@ export const TabsUI = (props: TabsUIProps) => {
 
   const getAI = async () => {
     try {
-      return await props.plugin.call('settings', 'getCopilotSetting')
+      const init_state = await props.plugin.call('settings', 'getCopilotSetting')
+      if (init_state === undefined || init_state === null) {
+        await props.plugin.call('settings', 'updateCopilotChoice', ai_switch)
+        return ai_switch
+      }
+      return init_state
     } catch (e) {
       return false
     }
diff --git a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx
index 4e0d224c1b..e2f281ed4b 100644
--- a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx
+++ b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx
@@ -235,12 +235,7 @@ export const RemixUiTerminal = (props: RemixUiTerminalProps) => {
     try {
       if (script.trim().startsWith('git')) {
         // await this.call('git', 'execute', script) code might be used in the future
-        // TODO: rm gpt or redirect gpt to sol-pgt
-      } else if (script.trim().startsWith('gpt')) {
-        call('terminal', 'log',{ type: 'warn', value: `> ${script}` })
-        await call('remixAI', 'solidity_answer', script) // No streaming supported in terminal
-        _paq.push(['trackEvent', 'ai', 'remixAI', 'askFromTerminal'])
-      } else if (script.trim().startsWith('sol-gpt')) {
+      } else if (script.trim().startsWith('gpt') || script.trim().startsWith('sol-gpt')) {
         call('terminal', 'log',{ type: 'warn', value: `> ${script}` })
         await call('remixAI', 'solidity_answer', script) // No streaming supported in terminal
         _paq.push(['trackEvent', 'ai', 'remixAI', 'askFromTerminal'])
diff --git a/libs/remix-ui/workspace/src/lib/types/index.ts b/libs/remix-ui/workspace/src/lib/types/index.ts
index ba23f4cdc2..e98dbd2075 100644
--- a/libs/remix-ui/workspace/src/lib/types/index.ts
+++ b/libs/remix-ui/workspace/src/lib/types/index.ts
@@ -70,7 +70,7 @@ export interface FilePanelType extends ViewPlugin {
   setWorkspace: ({ name, isLocalhost }, setEvent: boolean) => void
   createWorkspace: (name: string, workspaceTemplateName: string) => void
   renameWorkspace: (oldName: string, newName: string) => void
-  compileContractForUml: (path: string) => void
+  compileContractForUml?: (path: string) => void
   workspaceRenamed: ({ name }) => void
   workspaceCreated: ({ name }) => void
   workspaceDeleted: ({ name }) => void
@@ -81,7 +81,7 @@ export interface FilePanelType extends ViewPlugin {
   appManager: RemixAppManager
   registry?: any // registry
   pluginApi?: any
-  request: {
+  request?: {
     createWorkspace: () => void
     setWorkspace: (workspaceName: string) => void
     createNewFile: () => void
@@ -89,10 +89,10 @@ export interface FilePanelType extends ViewPlugin {
     getCurrentWorkspace: () => void
   } // api request,
   workspaces: any
-  registeredMenuItems: MenuItems // menu items
-  removedMenuItems: MenuItems
-  initialWorkspace: string
-  resetNewFile: () => void
+  registeredMenuItems?: MenuItems // menu items
+  removedMenuItems?: MenuItems
+  initialWorkspace?: string
+  resetNewFile?: () => void
   getWorkspaces: () => string[]
   expandPath: string[]
 }