+
>
)
-}
\ No newline at end of file
+}
+export { ChatApi }
\ No newline at end of file
diff --git a/libs/remix-ui/remix-ai/src/lib/components/color.css b/libs/remix-ui/remix-ai/src/lib/components/color.css
new file mode 100644
index 0000000000..836a05f103
--- /dev/null
+++ b/libs/remix-ui/remix-ai/src/lib/components/color.css
@@ -0,0 +1,89 @@
+.nlux-theme-remix_ai_theme[data-color-scheme='light'] {
+ --nlux-ChatRoom--BackgroundColor: var(--text-background);
+}
+
+.nlux-theme-remix_ai_theme[data-color-scheme='dark'] {
+ --nlux-ChatRoom--BackgroundColor: var(--text-background);
+}
+
+.nlux-theme-remix_ai_theme {
+
+ /* Override top-level chat room colors */
+ --nlux-ChatRoom--BorderColor: #24233d;
+ --nlux-ChatRoom-Divider--Color: var(--light);
+ /* --nlux-ChatRoom-Divider--BorderWidth:2px; */
+ --nlux-ChatRoom--TextColor: var(--text);
+
+ /* Override message bubble colors */
+ --nlux-AiMessage--BackgroundColor: var(--light);
+ --nlux-HumanMessage--BackgroundColor: var(--text-background);
+
+ /* Override border width */
+ --nlux-ChatRoom--BorderWidth: 0;
+ --nlux-SubmitButton--BorderWidth: 0;
+ --nlux-ChatItem-Avatar--BorderWidth: 0;
+ --nlux-ChatItem-Message-BubbleLayout--BorderWidth: 0;
+ --nlux-ConversationStarter--BorderWidth: 1;
+
+ /* Override border radius */
+ --nlux-ChatRoom--BorderRadius: 5px;
+ --nlux-SubmitButton--BorderRadius: 0 10px 10px 0;
+ --nlux-SubmitButton--Width: 73px;
+ --nlux-ChatItem-Avatar--BorderRadius: 5px;
+ --nlux-ChatItem-Message-BubbleLayout--BorderRadius: 5px;
+ --nlux-ConversationStarter--BorderRadius: 5px;
+ --nlux-PromptInput-Focus-Outline--Width: 10px;
+ --nlux-PromptInput-Max-Height: 50px;
+ --nlux-PromptInput--BorderWidth: 0;
+ .nlux-comp-composer > textarea {padding: 8px;}
+ --nlux-PromptInput--BorderRadius: 10px 0 0 10px;
+ --nlux-PromptInput-Height: 50px;
+
+
+ /* Override input colors */
+ --nlux-PromptInput--BackgroundColor: var(--light);
+ --nlux-PromptInput-Active--BackgroundColor: var(--light);
+ --nlux-PromptInput-Disabled--BackgroundColor: var(--dark);
+
+ /* Gap between submit button and input */
+ --nlux-Composer--Gap: 0;
+
+ /* Override submit button colors */
+ --nlux-SubmitButton--BackgroundColor: var(--primary);
+ --nlux-SubmitButton-Active--BackgroundColor:var(--primary);
+ --nlux-SubmitButton-Disabled--BackgroundColor: var(--dark);
+ --nlux-SubmitButton-Active--TextColor: var(--text);
+ --nlux-SubmitButton-Disabled--TextColor: var(--text);
+
+ /** Inline code in markdown */
+ --nlux-InlineCode--BorderRadius: 6px;
+ --nlux-InlineCode--BorderWidth: 0.5px;
+ --nlux-InlineCode--Padding: 0 2px;
+ --nlux-InlineCode--FontSize: 14px;
+
+
+ /*code block */
+ --nlux-CodeBlock-CopyButton--BackgroundColor: var(--bg-text);
+ --nlux-CodeBlock-CopyButton--TextColor: var(--text);
+
+ /*codeblock*/
+ /*--nlux-CodeBlock--BackgroundColor: var(--body-bg);*/
+ --nlux-CodeBlock--BackgroundColor: var(--bg-text);
+ --nlux-CodeBlock--BorderColor: var(--secondary);
+ --nlux-CodeBlock--Padding: 20px;
+ --nlux-CodeBlock--TextColor: var(--text);
+ --nlux-CodeBlock--FontSize: 14px;
+ --nlux-cvStrt--wd: var(--nlux-ConversationStarter--Width, 100px);
+
+ /* Conversation starter colors */
+ --nlux-ConversationStarter--BackgroundColor: var(--light);
+ --nlux-copy-icon: url('data:image/svg+xml,\
+
\
+ ');
+
+ /* Override icon for the send button */
+ --nlux-send-icon: url('data:image/svg+xml,
');
+
+}
diff --git a/libs/remix-ui/remix-ai/src/lib/components/personas.tsx b/libs/remix-ui/remix-ai/src/lib/components/personas.tsx
new file mode 100644
index 0000000000..850fee3ac7
--- /dev/null
+++ b/libs/remix-ui/remix-ai/src/lib/components/personas.tsx
@@ -0,0 +1,8 @@
+import { PersonaOptions, UserPersona } from '@nlux/react';
+
+export const user: UserPersona = {
+ name: 'Pipper',
+ avatar: 'assets/img/remix-logo-blue.png'
+};
+
+export const assistantAvatar = 'assets/img/remi-prof.webp';
diff --git a/libs/remix-ui/remix-ai/src/lib/components/send.ts b/libs/remix-ui/remix-ai/src/lib/components/send.ts
new file mode 100644
index 0000000000..cd40b2c40f
--- /dev/null
+++ b/libs/remix-ui/remix-ai/src/lib/components/send.ts
@@ -0,0 +1,47 @@
+
+// const demoProxyServerUrl = 'https://solcoder.remixproject.org';
+
+// export const send: StreamSend = async (
+// prompt: string,
+// observer: StreamingAdapterObserver,
+// plugin: any,
+// ) => {
+// const body = {"data": [prompt, 'solidity_answer', false,2000,0.9,0.8,50]};
+// const response = await axios(demoProxyServerUrl, {
+// method: 'POST',
+// headers: {'Content-Type': 'application/json'},
+// data: JSON.stringify(body),
+// });
+
+// console.log(plugin);
+// const result = await plugin.call('remixAI', 'solidity_answer', prompt);
+
+// if (response.status !== 200) {
+// observer.error(new Error('Failed to connect to the server'));
+// return;
+// }
+
+// if (response.statusText !== "OK") {
+// return;
+// }
+
+// // Read a stream of server-sent events
+// // and feed them to the observer as they are being generated
+// // const reader = response.body.getReader();
+// // const textDecoder = new TextDecoder();
+
+// // while (true) {
+// // const {value, done} = await reader.read();
+// // if (done) {
+// // break;
+// // }
+
+// // const content = textDecoder.decode(value);
+// // if (content) {
+// // observer.next(content);
+// // }
+// // }
+
+// observer.next(response.data.data[0]);
+// observer.complete();
+// };
diff --git a/libs/remix-ui/renderer/src/lib/renderer.tsx b/libs/remix-ui/renderer/src/lib/renderer.tsx
index 43ce77bf64..45aa945b2e 100644
--- a/libs/remix-ui/renderer/src/lib/renderer.tsx
+++ b/libs/remix-ui/renderer/src/lib/renderer.tsx
@@ -90,7 +90,7 @@ export const Renderer = ({ message, opt, plugin, context }: RendererProps) => {
try {
const content = await plugin.call('fileManager', 'readFile', editorOptions.errFile)
const message = intl.formatMessage({ id: `${context || 'solidity' }.openaigptMessage` }, { content, messageText })
- await plugin.call('remixAI', 'error_explaining', message)
+ await plugin.call('remixAI' as any, 'chatPipe', 'error_explaining', message)
_paq.push(['trackEvent', 'ai', 'remixAI', 'error_explaining_SolidityError'])
} catch (err) {
console.error('unable to askGtp')
diff --git a/libs/remix-ui/statusbar/src/lib/components/gitStatus.tsx b/libs/remix-ui/statusbar/src/lib/components/gitStatus.tsx
index 79f207806c..fd4a9e5c63 100644
--- a/libs/remix-ui/statusbar/src/lib/components/gitStatus.tsx
+++ b/libs/remix-ui/statusbar/src/lib/components/gitStatus.tsx
@@ -1,8 +1,9 @@
-import React, { useEffect, Dispatch, useState } from 'react'
+import React, { useEffect, Dispatch, useState, useContext } from 'react'
// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries
import { StatusBar } from 'apps/remix-ide/src/app/components/status-bar'
import '../../css/statusbar.css'
import { CustomTooltip } from '@remix-ui/helper'
+import { AppContext } from '@remix-ui/app'
export interface GitStatusProps {
plugin: StatusBar
@@ -11,70 +12,32 @@ export interface GitStatusProps {
}
export default function GitStatus({ plugin, gitBranchName, setGitBranchName }: GitStatusProps) {
- const [isLocalHost, setIsLocalHost] = useState(false)
+ const appContext = useContext(AppContext)
- useEffect(() => {
- plugin.on('filePanel', 'setWorkspace', async (workspace) => {
- const isGit = await plugin.call('fileManager', 'isGitRepo')
- setIsLocalHost(workspace.isLocalhost)
- if (isGit) {
- setGitBranchName(workspace.name)
- } else {
- setGitBranchName('Not a git repo')
- }
- })
- plugin.on('filePanel', 'workspaceInitializationCompleted', async () => {
- const isGit = await plugin.call('fileManager', 'isGitRepo')
- if (isGit) {
- const workspace = localStorage.getItem('currentWorkspace')
- setGitBranchName(workspace)
- } else {
- setGitBranchName('Not a git repo')
- }
- })
- plugin.on('dgitApi', 'init', async () => {
- const isGit = await plugin.call('fileManager', 'isGitRepo')
- if (isGit) {
- const workspace = localStorage.getItem('currentWorkspace')
- setGitBranchName(workspace)
- }
- })
-
- }, [])
-
- const lightDgitUp = async () => {
- const isActive = await plugin.call('manager', 'isActive', 'dgit')
- const isGit = await plugin.call('fileManager', 'isGitRepo')
- if (!isActive) await plugin.call('manager', 'activatePlugin', 'dgit')
- if (gitBranchName.length > 0 && isGit) {
- plugin.verticalIcons.select('dgit')
- }
+ const openDgit = async () => {
+ plugin.verticalIcons.select('dgit')
}
const initializeNewGitRepo = async () => {
- if (isLocalHost === false) {
- const isActive = await plugin.call('manager', 'isActive', 'dgit')
- if (!isActive) await plugin.call('manager', 'activatePlugin', 'dgit')
- await plugin.call('dgitApi', 'init')
- ;(window as any)._paq.push('trackEvent', 'statusbar', 'initNewRepo')
- }
+ await plugin.call('dgit', 'init')
+ await plugin.call('matomo', 'track', ['trackEvent', 'statusBar', 'initNewRepo']);
}
- const checkBranchName = ()=> {
- return gitBranchName && gitBranchName !== 'Not a git repo' && gitBranchName.length > 0
- }
+ if (!appContext.appState.canUseGit) return null
+
return (
await lightDgitUp()}
+ onClick={async () => await openDgit()}
>
- {checkBranchName() && isLocalHost === false ?
- : Initialize as git repo}
- {checkBranchName() && isLocalHost === false && {gitBranchName}}
- {checkBranchName() && isLocalHost === false && }
+ {!appContext.appState.needsGitInit ?
+ : Initialize as git repo}
+ {!appContext.appState.needsGitInit && appContext.appState.currentBranch &&
+ await openDgit()} className="ml-1">{appContext.appState.currentBranch.name}
+ }
)
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 68511dcbf4..bfa136f185 100644
--- a/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx
+++ b/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx
@@ -106,7 +106,6 @@ export const TabsUI = (props: TabsUIProps) => {
}
const renderTab = (tab: Tab, index) => {
-
const classNameImg = 'my-1 mr-1 text-dark ' + tab.iconClass
const classNameTab = 'nav-item nav-link d-flex justify-content-center align-items-center px-2 py-1 tab' + (index === currentIndexRef.current ? ' active' : '')
const invert = props.themeQuality === 'dark' ? 'invert(1)' : 'invert(0)'
@@ -251,7 +250,32 @@ export const TabsUI = (props: TabsUIProps) => {
const content = await props.plugin.call('fileManager', 'readFile', path)
if (tabsState.currentExt === 'sol') {
setExplaining(true)
- await props.plugin.call('remixAI', 'code_explaining', content)
+ // if plugin is pinned,
+ if (await props.plugin.call('pinnedPanel', 'currentFocus') === 'remixAI'){
+ await props.plugin.call('remixAI', 'chatPipe', 'code_explaining', content)
+ }
+ else {
+ const profile = {
+ name: 'remixAI',
+ displayName: 'Remix AI',
+ methods: ['code_generation', 'code_completion',
+ "solidity_answer", "code_explaining",
+ "code_insertion", "error_explaining",
+ "initialize", 'chatPipe', 'ProcessChatRequestBuffer', 'isChatRequestPending'],
+ events: [],
+ icon: 'assets/img/remix-logo-blue.png',
+ description: 'RemixAI provides AI services to Remix IDE.',
+ kind: '',
+ location: 'sidePanel',
+ documentation: 'https://remix-ide.readthedocs.io/en/latest/remixai.html',
+ maintainedBy: 'Remix'
+ }
+ // await props.plugin.call('sidePanel', 'focus', 'remixAI')
+ await props.plugin.call('sidePanel', 'pinView', profile)
+ setTimeout(async () => {
+ await props.plugin.call('remixAI', 'chatPipe', 'code_explaining', content)
+ }, 500)
+ }
setExplaining(false)
_paq.push(['trackEvent', 'ai', 'remixAI', 'explain_file'])
}
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 a17d6846cb..e7a4feb0aa 100644
--- a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx
+++ b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx
@@ -238,11 +238,11 @@ export const RemixUiTerminal = (props: RemixUiTerminalProps) => {
// 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)
+ await call('remixAI', 'solidity_answer', script) // No streaming supported in terminal
_paq.push(['trackEvent', 'ai', 'remixAI', 'askFromTerminal'])
} else if (script.trim().startsWith('sol-gpt')) {
call('terminal', 'log',{ type: 'warn', value: `> ${script}` })
- await call('remixAI', 'solidity_answer', script)
+ await call('remixAI', 'solidity_answer', script) // No streaming supported in terminal
_paq.push(['trackEvent', 'ai', 'remixAI', 'askFromTerminal'])
} else {
await call('scriptRunner', 'execute', script)
diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts
index dbd6ba738f..e60869e61d 100644
--- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts
+++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts
@@ -167,7 +167,7 @@ export const createWorkspace = async (
// commit the template as first commit
plugin.call('notification', 'toast', 'Creating initial git commit ...')
- await dgitPlugin.call('dgitApi', 'init')
+ await dgitPlugin.call('dgit', 'init')
if (!isEmpty) await loadWorkspacePreset(workspaceTemplateName, opts)
const status = await dgitPlugin.call('dgitApi', 'status', { ref: 'HEAD' })
diff --git a/libs/remix-ui/workspace/src/lib/components/file-explorer.tsx b/libs/remix-ui/workspace/src/lib/components/file-explorer.tsx
index 00b9db4b52..9853cf3739 100644
--- a/libs/remix-ui/workspace/src/lib/components/file-explorer.tsx
+++ b/libs/remix-ui/workspace/src/lib/components/file-explorer.tsx
@@ -584,7 +584,7 @@ export const FileExplorer = (props: FileExplorerProps) => {
const handleGitInit = async () => {
const isActive = await plugin.call('manager', 'isActive', 'dgit')
if (!isActive) await plugin.call('manager', 'activatePlugin', 'dgit')
- await plugin.call('dgitApi', 'init')
+ await plugin.call('dgit', 'init')
}
return (
diff --git a/package-lock.json b/package-lock.json
index 187acff3b3..d6109ef772 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "remix-project",
- "version": "0.55.0-dev",
+ "version": "0.57.0-dev",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "remix-project",
- "version": "0.55.0-dev",
+ "version": "0.57.0-dev",
"license": "MIT",
"dependencies": {
"@apollo/client": "^3.9.5",
@@ -76,6 +76,7 @@
"formik": "^2.4.5",
"from-exponential": "1.1.1",
"fs-extra": "^3.0.1",
+ "fuse.js": "^7.0.0",
"ganache": "^7.9.1",
"graphql": "^16.8.1",
"html-react-parser": "^3.0.4",
@@ -33583,6 +33584,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/fuse.js": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.0.0.tgz",
+ "integrity": "sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/galactus": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/galactus/-/galactus-0.2.1.tgz",
@@ -37029,11 +37038,10 @@
"license": "MIT"
},
"node_modules/http-proxy-middleware": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
- "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz",
+ "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/http-proxy": "^1.17.8",
"http-proxy": "^1.18.1",
diff --git a/package.json b/package.json
index 38c5ea6f3d..ed69522c69 100644
--- a/package.json
+++ b/package.json
@@ -106,6 +106,10 @@
"@isomorphic-git/lightning-fs": "^4.4.1",
"@metamask/eth-sig-util": "^7.0.2",
"@microlink/react-json-view": "^1.23.0",
+ "@nlux/core": "^2.17.1",
+ "@nlux/highlighter": "^2.17.1",
+ "@nlux/react": "^2.17.1",
+ "@nlux/themes": "^2.17.1",
"@openzeppelin/contracts": "^5.0.0",
"@openzeppelin/upgrades-core": "^1.30.0",
"@openzeppelin/wizard": "0.4.0",
diff --git a/yarn.lock b/yarn.lock
index 6aac3209ea..32b5903534 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5311,6 +5311,31 @@
pathval "1.1.1"
type-detect "4.0.8"
+"@nlux/core@2.17.1", "@nlux/core@^2.17.1":
+ version "2.17.1"
+ resolved "https://registry.yarnpkg.com/@nlux/core/-/core-2.17.1.tgz#18a95e21e5aafae83bf6d515651780497f0f39cc"
+ integrity sha512-hIvOnuENVqWaIg5Co4JtFmHph7Sp0Nj+QixOMdOW9Ou7CjU7HK+maB5koLoayNL64B+wHTtgPN7zBrB8NCSPXw==
+
+"@nlux/highlighter@^2.17.1":
+ version "2.17.1"
+ resolved "https://registry.yarnpkg.com/@nlux/highlighter/-/highlighter-2.17.1.tgz#e4d0f43b5afeff2631bc118b1cc6db80afb7e99f"
+ integrity sha512-/ETnJPbNJWY8ZQH6XAQ5zooEMPsy44Lk2tIxMfr5Ca7+0ICpkMP0mppOmAoKCQBNVsqmKe0oczFBk8blddNDaA==
+ dependencies:
+ "@nlux/core" "2.17.1"
+ highlight.js "^11"
+
+"@nlux/react@^2.17.1":
+ version "2.17.1"
+ resolved "https://registry.yarnpkg.com/@nlux/react/-/react-2.17.1.tgz#e4668e7cbe42dd195ea86a02350c8b15cb8f48f0"
+ integrity sha512-/t6qDAHIefg1vGIthLOtkQxbI4Sh/aL7/eqVuhcoC1w/8NqnvVxwfxR0mkshcIVrKSwHI8Yjav5edZ2yeRBqMw==
+ dependencies:
+ "@nlux/core" "2.17.1"
+
+"@nlux/themes@^2.17.1":
+ version "2.17.1"
+ resolved "https://registry.yarnpkg.com/@nlux/themes/-/themes-2.17.1.tgz#f991b1b5fcf9595e59d0abeb76f9997876b44784"
+ integrity sha512-spD3QJBSdkF+q45rQFFsUQcR4pTy3OEjQywEP+yc9dHcuPrxIMb0/W/whwiHn1aePGL758lKQH3E/NRHA4aSAw==
+
"@noble/curves@1.0.0", "@noble/curves@~1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.0.0.tgz#e40be8c7daf088aaf291887cbc73f43464a92932"
@@ -17700,6 +17725,11 @@ hey-listen@^1.0.8:
resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68"
integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==
+highlight.js@^11:
+ version "11.10.0"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.10.0.tgz#6e3600dc4b33d6dc23d5bd94fbf72405f5892b92"
+ integrity sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==
+
hmac-drbg@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
@@ -17895,9 +17925,9 @@ http-proxy-agent@^7.0.0:
debug "^4.3.4"
http-proxy-middleware@^2.0.3:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f"
- integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz#915f236d92ae98ef48278a95dedf17e991936ec6"
+ integrity sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==
dependencies:
"@types/http-proxy" "^1.17.8"
http-proxy "^1.18.1"