Compare commits
2 Commits
03e1e5662d
...
eb5025774f
| Author | SHA1 | Date | |
|---|---|---|---|
| eb5025774f | |||
| 7c64f310c9 |
@ -1,5 +1,9 @@
|
||||
# LingTropy
|
||||
|
||||
LingTropy 是一个基于 Electron + Vue3 开发的桌面应用,用于文案和标题的智能改写。
|
||||
|
||||
|
||||
|
||||
减小包体
|
||||
yarn global add depcheck
|
||||
depcheck
|
||||
|
||||
4
lingtropy-client/package-lock.json
generated
4
lingtropy-client/package-lock.json
generated
@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "lingtropy",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.3",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "lingtropy",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.3",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@mdi/font": "^7.4.47",
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "lingtropy",
|
||||
"appId": "com.lingnite.lingtropy",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.3",
|
||||
"description": "文案助手",
|
||||
"homepage": "https://www.lingnite.com",
|
||||
"author": "沈阳泠启网络科技有限公司",
|
||||
|
||||
8
lingtropy-client/scripts/latest.yml
Normal file
8
lingtropy-client/scripts/latest.yml
Normal file
@ -0,0 +1,8 @@
|
||||
version: 1.0.4
|
||||
files:
|
||||
- url: LingTropy-1.0.4.exe
|
||||
sha512: ea933ab60977948529541ce4b012c8de980b436d149c9e9c3ced27f09c5d88eafda9fc46de04b003e00440c9b90deb1ff440490f3d3b9d4b5963c033d338cc22
|
||||
size: 29
|
||||
path: LingTropy-1.0.4.exe
|
||||
sha512: ea933ab60977948529541ce4b012c8de980b436d149c9e9c3ced27f09c5d88eafda9fc46de04b003e00440c9b90deb1ff440490f3d3b9d4b5963c033d338cc22
|
||||
releaseDate: '2025-04-12T22:55:48.000Z'
|
||||
160
lingtropy-client/scripts/update_server.py
Normal file
160
lingtropy-client/scripts/update_server.py
Normal file
@ -0,0 +1,160 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import os
|
||||
import json
|
||||
import hashlib
|
||||
import http.server
|
||||
import socketserver
|
||||
import shutil
|
||||
import sys
|
||||
from datetime import datetime
|
||||
|
||||
# 配置
|
||||
PORT = 3000
|
||||
UPDATES_DIR = "updates"
|
||||
CURRENT_VERSION = "1.0.0"
|
||||
NEW_VERSION = "1.0.4"
|
||||
|
||||
# 获取脚本所在目录的绝对路径
|
||||
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
# 设置工作目录为脚本所在目录
|
||||
os.chdir(SCRIPT_DIR)
|
||||
|
||||
def log(message):
|
||||
print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {message}")
|
||||
|
||||
log(f"启动更新服务器在端口 {PORT}")
|
||||
log(f"脚本目录: {SCRIPT_DIR}")
|
||||
log(f"更新目录: {os.path.join(SCRIPT_DIR, UPDATES_DIR)}")
|
||||
log(f"当前版本: {CURRENT_VERSION}")
|
||||
log(f"新版本: {NEW_VERSION}")
|
||||
|
||||
# 确保更新目录存在
|
||||
os.makedirs(UPDATES_DIR, exist_ok=True)
|
||||
|
||||
# 生成latest.yml文件
|
||||
def generate_latest_yml():
|
||||
log("生成 latest.yml 文件...")
|
||||
# 假设安装包已经存在
|
||||
installer_path = os.path.join(UPDATES_DIR, f"LingTropy-{NEW_VERSION}.exe")
|
||||
|
||||
# 如果安装包不存在,创建一个假的
|
||||
if not os.path.exists(installer_path):
|
||||
log(f"创建测试安装包: {installer_path}")
|
||||
with open(installer_path, "wb") as f:
|
||||
f.write(b"This is a fake installer file")
|
||||
|
||||
# 计算文件大小和SHA512
|
||||
file_size = os.path.getsize(installer_path)
|
||||
with open(installer_path, "rb") as f:
|
||||
file_hash = hashlib.sha512(f.read()).hexdigest()
|
||||
|
||||
# 生成latest.yml内容
|
||||
yml_content = f"""version: {NEW_VERSION}
|
||||
files:
|
||||
- url: LingTropy-{NEW_VERSION}.exe
|
||||
sha512: {file_hash}
|
||||
size: {file_size}
|
||||
path: LingTropy-{NEW_VERSION}.exe
|
||||
sha512: {file_hash}
|
||||
releaseDate: '{datetime.now().strftime("%Y-%m-%dT%H:%M:%S.000Z")}'
|
||||
"""
|
||||
|
||||
# 写入latest.yml文件
|
||||
yml_path = os.path.join(UPDATES_DIR, "latest.yml")
|
||||
with open(yml_path, "w", encoding="utf-8") as f:
|
||||
f.write(yml_content)
|
||||
|
||||
log(f"已生成 latest.yml 文件: {yml_path}")
|
||||
log(f"文件内容:\n{yml_content}")
|
||||
|
||||
# 自定义HTTP请求处理器
|
||||
class UpdateRequestHandler(http.server.SimpleHTTPRequestHandler):
|
||||
def log_message(self, format, *args):
|
||||
log(f"{self.address_string()} - {format%args}")
|
||||
|
||||
def do_GET(self):
|
||||
log(f"收到GET请求: {self.path}")
|
||||
|
||||
try:
|
||||
# 处理 /updates 路径
|
||||
if self.path.startswith('/updates'):
|
||||
# 移除 /updates 前缀
|
||||
self.path = self.path[len('/updates'):]
|
||||
if not self.path:
|
||||
self.path = '/'
|
||||
log(f"处理更新请求,修改后的路径: {self.path}")
|
||||
|
||||
# 设置CORS头
|
||||
self.send_response(200)
|
||||
self.send_header('Access-Control-Allow-Origin', '*')
|
||||
self.send_header('Access-Control-Allow-Methods', 'GET, OPTIONS')
|
||||
self.send_header('Access-Control-Allow-Headers', '*')
|
||||
|
||||
# 根据请求路径设置Content-Type
|
||||
if self.path.endswith('.yml'):
|
||||
log("返回YAML文件")
|
||||
self.send_header('Content-Type', 'application/x-yaml')
|
||||
elif self.path.endswith('.exe'):
|
||||
log("返回EXE文件")
|
||||
self.send_header('Content-Type', 'application/octet-stream')
|
||||
else:
|
||||
log("返回文本内容")
|
||||
self.send_header('Content-Type', 'text/plain')
|
||||
|
||||
self.end_headers()
|
||||
|
||||
# 如果请求的是根路径,返回更新信息
|
||||
if self.path == '/':
|
||||
response = {
|
||||
"version": NEW_VERSION,
|
||||
"releaseDate": datetime.now().strftime("%Y-%m-%dT%H:%M:%S.000Z"),
|
||||
"releaseNotes": "This is a test update with some new features and bug fixes."
|
||||
}
|
||||
log(f"返回更新信息: {json.dumps(response, indent=2)}")
|
||||
self.wfile.write(json.dumps(response).encode())
|
||||
return
|
||||
|
||||
# 否则,尝试提供请求的文件
|
||||
file_path = self.translate_path(self.path)
|
||||
log(f"请求文件路径: {file_path}")
|
||||
if os.path.exists(file_path) and os.path.isfile(file_path):
|
||||
log(f"文件存在,正在发送...")
|
||||
with open(file_path, 'rb') as f:
|
||||
self.wfile.write(f.read())
|
||||
else:
|
||||
log(f"文件不存在: {file_path}")
|
||||
self.send_error(404, "File not found")
|
||||
except Exception as e:
|
||||
log(f"处理请求时出错: {str(e)}")
|
||||
self.send_error(500, str(e))
|
||||
|
||||
def do_OPTIONS(self):
|
||||
log(f"收到OPTIONS请求: {self.path}")
|
||||
# 处理预检请求
|
||||
self.send_response(200)
|
||||
self.send_header('Access-Control-Allow-Origin', '*')
|
||||
self.send_header('Access-Control-Allow-Methods', 'GET, OPTIONS')
|
||||
self.send_header('Access-Control-Allow-Headers', '*')
|
||||
self.end_headers()
|
||||
|
||||
def main():
|
||||
try:
|
||||
# 生成更新文件
|
||||
generate_latest_yml()
|
||||
|
||||
# 启动服务器
|
||||
with socketserver.TCPServer(("", PORT), UpdateRequestHandler) as httpd:
|
||||
log(f"服务器已启动在 http://localhost:{PORT}")
|
||||
log("按 Ctrl+C 停止服务器")
|
||||
httpd.serve_forever()
|
||||
except KeyboardInterrupt:
|
||||
log("服务器已停止")
|
||||
sys.exit(0)
|
||||
except Exception as e:
|
||||
log(f"服务器错误: {str(e)}")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@ -8,7 +8,7 @@ export const API_ENDPOINTS = {
|
||||
export const AI_CONFIG = {
|
||||
DEFAULT_MODEL: 'gpt-4o',
|
||||
CONTENT_MAX_TOKENS: 1800, // 约900字
|
||||
TITLE_MAX_TOKENS: 50, // 约20字
|
||||
TITLE_MAX_TOKENS: 50, // 约20字
|
||||
TEMPERATURE: 0.8,
|
||||
MAX_RETRIES: 2,
|
||||
TIMEOUT: 30000
|
||||
@ -16,8 +16,10 @@ export const AI_CONFIG = {
|
||||
|
||||
// 提示词模板
|
||||
export const PROMPTS = {
|
||||
CONTENT_REWRITE: '你是一个小红书文案写手,能够熟练地根据用户的输入,改写成内容相近,但表达方式不同的新文案。你的文案中需要具备吸人眼球的钩子,能够牢牢抓住用户的注意力。请直接输出新的文案,不要输出其他任何提示性词语, 以纯文本的形式输出。注意:输出的文案不要超过900字。',
|
||||
TITLE_REWRITE: '你是一个小红书标题写手,能够熟练地根据用户的输入,改写成内容相近,但表达方式不同的新标题。你的标题中需要具备吸人眼球的钩子,能够牢牢抓住用户的注意力。请直接输出新的标题,不要输出其他任何提示性词语, 以纯文本的形式输出。注意:输出的标题不要超过20字。'
|
||||
CONTENT_REWRITE:
|
||||
'你是一个小红书文案写手,能够熟练地根据用户的输入,改写成内容相近,但表达方式不同的新文案。你的文案中需要具备吸人眼球的钩子,能够牢牢抓住用户的注意力。请直接输出新的文案,不要输出其他任何提示性词语, 以纯文本的形式输出。注意:输出的文案不要超过900字。',
|
||||
TITLE_REWRITE:
|
||||
'你是一个小红书标题写手,能够熟练地根据用户的输入,改写成内容相近,但表达方式不同的新标题。你的标题中需要具备吸人眼球的钩子,能够牢牢抓住用户的注意力。请直接输出新的标题,不要输出其他任何提示性词语, 以纯文本的形式输出。注意:输出的标题不要超过20字。'
|
||||
} as const
|
||||
|
||||
// 存储键名
|
||||
@ -39,4 +41,4 @@ export const UI_CONFIG = {
|
||||
// export const APP_INFO = {
|
||||
// VERSION: '1.0.0',
|
||||
// NAME: 'LingTropy'
|
||||
// } as const
|
||||
// } as const
|
||||
|
||||
@ -3,13 +3,7 @@ import Constants from './utils/Constants'
|
||||
import Store from 'electron-store'
|
||||
import axios from 'axios'
|
||||
import OpenAI from 'openai'
|
||||
import {
|
||||
API_ENDPOINTS,
|
||||
AI_CONFIG,
|
||||
PROMPTS,
|
||||
STORE_KEYS,
|
||||
APP_INFO
|
||||
} from '../constants'
|
||||
import { API_ENDPOINTS, AI_CONFIG, PROMPTS, STORE_KEYS, APP_INFO } from '../constants'
|
||||
|
||||
const store = new Store()
|
||||
/*
|
||||
@ -46,7 +40,7 @@ export default class IPCs {
|
||||
ipcMain.handle('fetch-models', async () => {
|
||||
try {
|
||||
const response = await axios.get(API_ENDPOINTS.FETCH_MODELS)
|
||||
console.log('获取模型数据成功:', response.data)
|
||||
// console.log('获取模型数据成功:', response.data)
|
||||
return response.data.data
|
||||
} catch (error) {
|
||||
console.error('获取模型数据失败:', error)
|
||||
@ -99,14 +93,76 @@ export default class IPCs {
|
||||
})
|
||||
.then(async (stream) => {
|
||||
let fullResponse = ''
|
||||
for await (const chunk of stream) {
|
||||
const content = chunk.choices[0].delta.content || ''
|
||||
fullResponse += content
|
||||
// 实时发送每个请求的部分结果
|
||||
event.sender.send('openai-partial-response', { index, content })
|
||||
try {
|
||||
for await (const chunk of stream) {
|
||||
console.log('原始chunk数据:', JSON.stringify(chunk))
|
||||
// 判断是否为结束信号
|
||||
if (!chunk.choices || chunk.choices.length === 0) {
|
||||
console.log('流处理结束, 收到空choices数据')
|
||||
// 只发送状态信息,不视为错误
|
||||
event.sender.send('openai-partial-response', {
|
||||
index,
|
||||
content: '',
|
||||
status: 'complete'
|
||||
})
|
||||
continue
|
||||
}
|
||||
|
||||
// 检查choices[0]是否存在
|
||||
if (!chunk.choices[0]) {
|
||||
console.log('流响应中choices[0]不存在,可能是结束信号', chunk)
|
||||
event.sender.send('openai-partial-response', {
|
||||
index,
|
||||
content: '',
|
||||
status: 'complete'
|
||||
})
|
||||
continue
|
||||
}
|
||||
|
||||
// 检查delta属性是否存在
|
||||
if (chunk.choices[0].delta) {
|
||||
const content = chunk.choices[0].delta.content || ''
|
||||
fullResponse += content
|
||||
console.log('content', content)
|
||||
// 实时发送每个请求的部分结果
|
||||
event.sender.send('openai-partial-response', { index, content })
|
||||
} else {
|
||||
// 处理没有delta属性的情况
|
||||
console.log('没有delta属性:', chunk.choices[0])
|
||||
|
||||
// 向用户发送一个特殊的消息,表明这是一个状态信息而不是内容
|
||||
event.sender.send('openai-partial-response', {
|
||||
index,
|
||||
content: '',
|
||||
status: chunk.choices[0].finish_reason || 'unknown'
|
||||
})
|
||||
}
|
||||
}
|
||||
} catch (streamError) {
|
||||
// 捕获流处理过程中的错误
|
||||
const errorMessage = `处理API响应流时出错: ${streamError.message}`
|
||||
console.error(errorMessage, streamError)
|
||||
event.sender.send('openai-partial-response', {
|
||||
index,
|
||||
content: '',
|
||||
status: 'error',
|
||||
error: errorMessage
|
||||
})
|
||||
}
|
||||
// 返回最终结果
|
||||
return { index, response: fullResponse }
|
||||
return { index, response: fullResponse || '生成失败,请重试' }
|
||||
})
|
||||
.catch((createError) => {
|
||||
// 处理create方法调用的错误
|
||||
const errorMessage = `调用API时出错: ${createError.message}`
|
||||
console.error(errorMessage, createError)
|
||||
event.sender.send('openai-partial-response', {
|
||||
index,
|
||||
content: '',
|
||||
status: 'error',
|
||||
error: errorMessage
|
||||
})
|
||||
return { index, response: '生成失败,请重试' }
|
||||
})
|
||||
})
|
||||
|
||||
@ -117,13 +173,29 @@ export default class IPCs {
|
||||
return results
|
||||
} catch (error) {
|
||||
console.error('Error:', error)
|
||||
// 发送通用错误消息到所有预期的索引
|
||||
for (let i = 0; i < count; i++) {
|
||||
event.sender.send('openai-partial-response', {
|
||||
index: i,
|
||||
content: '',
|
||||
status: 'error',
|
||||
error: `生成内容时发生错误: ${error.message || '未知错误'}`
|
||||
})
|
||||
}
|
||||
throw error // 将错误传递给调用者
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.handle(
|
||||
'call-openai-title',
|
||||
async (event, baseUrl: string, apiKey: string, model: string, count: number, text: string) => {
|
||||
async (
|
||||
event,
|
||||
baseUrl: string,
|
||||
apiKey: string,
|
||||
model: string,
|
||||
count: number,
|
||||
text: string
|
||||
) => {
|
||||
try {
|
||||
const client = new OpenAI({
|
||||
baseURL: baseUrl,
|
||||
@ -139,7 +211,8 @@ export default class IPCs {
|
||||
messages: [
|
||||
{
|
||||
role: 'system',
|
||||
content: '你是一个小红书标题写手,能够熟练地根据用户的输入,改写成内容相近,但表达方式不同的新标题。你的标题中需要具备吸人眼球的钩子,能够牢牢抓住用户的注意力。请直接输出新的标题,不要输出其他任何提示性词语, 以纯文本的形式输出。注意:输出的标题不要超过20字。'
|
||||
content:
|
||||
'你是一个小红书标题写手,能够熟练地根据用户的输入,改写成内容相近,但表达方式不同的新标题。你的标题中需要具备吸人眼球的钩子,能够牢牢抓住用户的注意力。请直接输出新的标题,不要输出其他任何提示性词语, 以纯文本的形式输出。注意:输出的标题不要超过20字。'
|
||||
},
|
||||
{ role: 'user', content: text }
|
||||
],
|
||||
@ -149,14 +222,76 @@ export default class IPCs {
|
||||
})
|
||||
.then(async (stream) => {
|
||||
let fullResponse = ''
|
||||
for await (const chunk of stream) {
|
||||
const content = chunk.choices[0].delta.content || ''
|
||||
fullResponse += content
|
||||
// 实时发送每个请求的部分结果
|
||||
event.sender.send('openai-partial-response', { index, content })
|
||||
try {
|
||||
for await (const chunk of stream) {
|
||||
console.log('原始chunk数据:', JSON.stringify(chunk))
|
||||
// 判断是否为结束信号
|
||||
if (!chunk.choices || chunk.choices.length === 0) {
|
||||
console.log('流处理结束, 收到空choices数据')
|
||||
// 只发送状态信息,不视为错误
|
||||
event.sender.send('openai-partial-response', {
|
||||
index,
|
||||
content: '',
|
||||
status: 'complete'
|
||||
})
|
||||
continue
|
||||
}
|
||||
|
||||
// 检查choices[0]是否存在
|
||||
if (!chunk.choices[0]) {
|
||||
console.log('流响应中choices[0]不存在,可能是结束信号', chunk)
|
||||
event.sender.send('openai-partial-response', {
|
||||
index,
|
||||
content: '',
|
||||
status: 'complete'
|
||||
})
|
||||
continue
|
||||
}
|
||||
|
||||
// 检查delta属性是否存在
|
||||
if (chunk.choices[0].delta) {
|
||||
const content = chunk.choices[0].delta.content || ''
|
||||
fullResponse += content
|
||||
|
||||
// 实时发送每个请求的部分结果
|
||||
event.sender.send('openai-partial-response', { index, content })
|
||||
} else {
|
||||
// 处理没有delta属性的情况
|
||||
console.log('没有delta属性:', chunk.choices[0])
|
||||
|
||||
// 向用户发送一个特殊的消息,表明这是一个状态信息而不是内容
|
||||
event.sender.send('openai-partial-response', {
|
||||
index,
|
||||
content: '',
|
||||
status: chunk.choices[0].finish_reason || 'unknown'
|
||||
})
|
||||
}
|
||||
}
|
||||
} catch (streamError) {
|
||||
// 捕获流处理过程中的错误
|
||||
const errorMessage = `处理API响应流时出错: ${streamError.message}`
|
||||
console.error(errorMessage, streamError)
|
||||
event.sender.send('openai-partial-response', {
|
||||
index,
|
||||
content: '',
|
||||
status: 'error',
|
||||
error: errorMessage
|
||||
})
|
||||
}
|
||||
// 返回最终结果
|
||||
return { index, response: fullResponse.trim() }
|
||||
return { index, response: fullResponse.trim() || '生成失败,请重试' }
|
||||
})
|
||||
.catch((createError) => {
|
||||
// 处理create方法调用的错误
|
||||
const errorMessage = `调用API时出错: ${createError.message}`
|
||||
console.error(errorMessage, createError)
|
||||
event.sender.send('openai-partial-response', {
|
||||
index,
|
||||
content: '',
|
||||
status: 'error',
|
||||
error: errorMessage
|
||||
})
|
||||
return { index, response: '生成失败,请重试' }
|
||||
})
|
||||
})
|
||||
|
||||
@ -167,6 +302,15 @@ export default class IPCs {
|
||||
return results
|
||||
} catch (error) {
|
||||
console.error('生成标题失败:', error)
|
||||
// 发送通用错误消息到所有预期的索引
|
||||
for (let i = 0; i < count; i++) {
|
||||
event.sender.send('openai-partial-response', {
|
||||
index: i,
|
||||
content: '',
|
||||
status: 'error',
|
||||
error: `生成标题时发生错误: ${error.message || '未知错误'}`
|
||||
})
|
||||
}
|
||||
throw error
|
||||
}
|
||||
}
|
||||
@ -203,7 +347,5 @@ export default class IPCs {
|
||||
})
|
||||
return dialogResult
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,25 +1,35 @@
|
||||
import { app, WebContents, RenderProcessGoneDetails } from 'electron'
|
||||
import { app, WebContents, RenderProcessGoneDetails, BrowserWindow } from 'electron'
|
||||
import Constants from './utils/Constants'
|
||||
import { createErrorWindow, createMainWindow } from './MainRunner'
|
||||
import { registerUpdateHandlers, setupUpdateListeners, setMainWindow } from './update'
|
||||
|
||||
let mainWindow
|
||||
let errorWindow
|
||||
|
||||
app.on('ready', async () => {
|
||||
if (Constants.IS_DEV_ENV) {
|
||||
import('./index.dev')
|
||||
}
|
||||
// 注册更新处理器
|
||||
registerUpdateHandlers()
|
||||
|
||||
// Disable special menus on macOS by uncommenting the following, if necessary
|
||||
/*
|
||||
if (Constants.IS_MAC) {
|
||||
systemPreferences.setUserDefault('NSDisabledDictationMenuItem', 'boolean', true)
|
||||
systemPreferences.setUserDefault('NSDisabledCharacterPaletteMenuItem', 'boolean', true)
|
||||
}
|
||||
*/
|
||||
app.whenReady().then(async () => {
|
||||
try {
|
||||
if (Constants.IS_DEV_ENV) {
|
||||
import('./index.dev')
|
||||
}
|
||||
|
||||
mainWindow = await createMainWindow()
|
||||
// mainWindow.setTile("23")
|
||||
// Disable special menus on macOS by uncommenting the following, if necessary
|
||||
/*
|
||||
if (Constants.IS_MAC) {
|
||||
systemPreferences.setUserDefault('NSDisabledDictationMenuItem', 'boolean', true)
|
||||
systemPreferences.setUserDefault('NSDisabledCharacterPaletteMenuItem', 'boolean', true)
|
||||
}
|
||||
*/
|
||||
|
||||
mainWindow = await createMainWindow()
|
||||
setMainWindow(mainWindow)
|
||||
setupUpdateListeners()
|
||||
} catch (error) {
|
||||
console.error('创建主窗口失败:', error)
|
||||
errorWindow = await createErrorWindow(errorWindow, mainWindow)
|
||||
}
|
||||
})
|
||||
|
||||
app.on('activate', async () => {
|
||||
|
||||
101
lingtropy-client/src/main/update.ts
Normal file
101
lingtropy-client/src/main/update.ts
Normal file
@ -0,0 +1,101 @@
|
||||
import { app, ipcMain } from 'electron'
|
||||
import { autoUpdater } from 'electron-updater'
|
||||
import { version } from '../../package.json'
|
||||
import Constants from './utils/Constants'
|
||||
|
||||
// 配置自动更新
|
||||
autoUpdater.autoDownload = false
|
||||
autoUpdater.autoInstallOnAppQuit = true
|
||||
|
||||
// 设置更新服务器
|
||||
const updateServerUrl = 'https://mcallzbl-blog.oss-cn-beijing.aliyuncs.com/updates' // 生产环境,实际部署时改为真实的URL
|
||||
|
||||
// 配置更新选项
|
||||
autoUpdater.setFeedURL({
|
||||
provider: 'generic',
|
||||
url: updateServerUrl
|
||||
})
|
||||
|
||||
// 配置请求头(如果需要)
|
||||
autoUpdater.requestHeaders = {
|
||||
'User-Agent': 'LingTropy-Update-Check'
|
||||
}
|
||||
|
||||
let mainWindow: Electron.BrowserWindow | null = null
|
||||
|
||||
// 检查更新
|
||||
const checkForUpdates = async () => {
|
||||
try {
|
||||
const updateCheckResult = await autoUpdater.checkForUpdates()
|
||||
console.log('updateCheckResult', updateCheckResult)
|
||||
const latestVersion = updateCheckResult?.updateInfo?.version
|
||||
const releaseNotes = updateCheckResult?.updateInfo?.releaseNotes
|
||||
|
||||
// 如果获取不到新版本信息,返回当前版本信息
|
||||
if (!latestVersion) {
|
||||
console.log('没有新版本信息')
|
||||
return {
|
||||
hasUpdate: false,
|
||||
currentVersion: version,
|
||||
latestVersion: version,
|
||||
releaseNotes: ''
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
hasUpdate: latestVersion !== version,
|
||||
currentVersion: version,
|
||||
latestVersion,
|
||||
releaseNotes
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('检查更新失败:', error)
|
||||
// 发生错误时也返回当前版本信息
|
||||
return {
|
||||
hasUpdate: false,
|
||||
currentVersion: version,
|
||||
latestVersion: version,
|
||||
releaseNotes: ''
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 开始更新
|
||||
const startUpdate = async () => {
|
||||
try {
|
||||
await autoUpdater.downloadUpdate()
|
||||
} catch (error) {
|
||||
console.error('下载更新失败:', error)
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
// 设置更新事件监听
|
||||
export const setupUpdateListeners = () => {
|
||||
// 更新下载进度
|
||||
autoUpdater.on('download-progress', (progressObj) => {
|
||||
mainWindow?.webContents.send('update-progress', progressObj)
|
||||
})
|
||||
|
||||
// 更新下载完成
|
||||
autoUpdater.on('update-downloaded', () => {
|
||||
mainWindow?.webContents.send('update-downloaded')
|
||||
autoUpdater.quitAndInstall()
|
||||
})
|
||||
|
||||
// 更新错误
|
||||
autoUpdater.on('error', (error) => {
|
||||
console.error('更新错误:', error)
|
||||
mainWindow?.webContents.send('update-error', error.message)
|
||||
})
|
||||
}
|
||||
|
||||
// 注册IPC处理器
|
||||
export const registerUpdateHandlers = () => {
|
||||
ipcMain.handle('check-for-updates', checkForUpdates)
|
||||
ipcMain.handle('start-update', startUpdate)
|
||||
}
|
||||
|
||||
export const setMainWindow = (window: Electron.BrowserWindow) => {
|
||||
mainWindow = window
|
||||
}
|
||||
@ -13,7 +13,9 @@ const mainAvailChannels: string[] = [
|
||||
'openai-partial-response',
|
||||
'get-api-key',
|
||||
'set-api-key',
|
||||
'call-openai-title'
|
||||
'call-openai-title',
|
||||
'check-for-updates',
|
||||
'start-update'
|
||||
]
|
||||
const rendererAvailChannels: string[] = ['openai-partial-response', 'get-api-key', 'set-api-key']
|
||||
|
||||
|
||||
@ -49,4 +49,4 @@
|
||||
font-size: 17px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
||||
@ -44,6 +44,27 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<v-divider class="my-4"></v-divider>
|
||||
<div class="version-info">
|
||||
<div class="d-flex align-center mb-2">
|
||||
<span class="text-subtitle-1 mr-2">当前版本:</span>
|
||||
<span class="text-body-1">{{ currentVersion }}</span>
|
||||
</div>
|
||||
<!-- <div class="d-flex align-center">
|
||||
<v-btn color="primary" :loading="isChecking" @click="checkForUpdates" class="mr-2">
|
||||
检查更新
|
||||
</v-btn>
|
||||
<span v-if="updateInfo" class="text-body-2">
|
||||
{{
|
||||
updateInfo.hasUpdate ? '发现新版本:' + updateInfo.latestVersion : '已是最新版本'
|
||||
}}
|
||||
</span>
|
||||
</div> -->
|
||||
<div v-if="updateInfo?.releaseNotes" class="mt-2">
|
||||
<div class="text-subtitle-2 mb-1">更新说明:</div>
|
||||
<div class="text-body-2">{{ updateInfo.releaseNotes }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<div class="copyright"> 仅供测试开发使用,严禁对外销售 </div>
|
||||
@ -58,6 +79,14 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, defineProps, watch } from 'vue'
|
||||
|
||||
interface UpdateInfo {
|
||||
currentVersion: string
|
||||
latestVersion: string
|
||||
hasUpdate: boolean
|
||||
releaseNotes?: string
|
||||
}
|
||||
|
||||
const props = defineProps({
|
||||
tokenvalue: {
|
||||
type: String,
|
||||
@ -77,6 +106,27 @@ watch(userToken, (newValue) => {
|
||||
emit('update:tokenvalue', newValue)
|
||||
})
|
||||
|
||||
// 版本信息相关
|
||||
const currentVersion = ref('')
|
||||
const updateInfo = ref<UpdateInfo | null>(null)
|
||||
// const isChecking = ref(false)
|
||||
|
||||
// 检查更新
|
||||
// const checkForUpdates = async () => {
|
||||
// try {
|
||||
// isChecking.value = true
|
||||
// updateInfo.value = await window.mainApi.invoke('check-for-updates')
|
||||
// if (updateInfo.value?.hasUpdate) {
|
||||
// // 如果有更新,可以在这里添加自动下载或提示用户下载的逻辑
|
||||
// console.log('发现新版本:', updateInfo.value)
|
||||
// }
|
||||
// } catch (error) {
|
||||
// console.error('检查更新失败:', error)
|
||||
// } finally {
|
||||
// isChecking.value = false
|
||||
// }
|
||||
// }
|
||||
|
||||
// 初始化时获取令牌
|
||||
onMounted(async () => {
|
||||
// 从本地存储获取令牌
|
||||
@ -87,6 +137,9 @@ onMounted(async () => {
|
||||
// 如果令牌为空,显示提醒
|
||||
showTokenAlert.value = true
|
||||
}
|
||||
|
||||
// 获取当前版本
|
||||
currentVersion.value = await window.mainApi.invoke('msgRequestGetVersion')
|
||||
})
|
||||
|
||||
// 设置弹窗相关
|
||||
@ -489,4 +542,10 @@ const saveSettings = () => {
|
||||
padding: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
.version-info {
|
||||
padding: 16px;
|
||||
background-color: #f5f5f5;
|
||||
border-radius: 4px;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -17,11 +17,7 @@
|
||||
<span class="mode-icon">🔄</span>
|
||||
单次改写
|
||||
</button>
|
||||
<button
|
||||
:class="{ active: mode === 'batch' }"
|
||||
@click="switchMode('batch')"
|
||||
class="mode-tab"
|
||||
>
|
||||
<button :class="{ active: mode === 'batch' }" @click="switchMode('batch')" class="mode-tab">
|
||||
<span class="mode-icon">🔀</span>
|
||||
批量改写
|
||||
</button>
|
||||
@ -31,11 +27,9 @@
|
||||
<div v-if="mode === 'batch'" class="generation-count">
|
||||
<label for="count-input">生成数量:</label>
|
||||
<div class="count-control">
|
||||
<button
|
||||
:disabled="generationCount <= 1"
|
||||
@click="decrementCount"
|
||||
class="count-button"
|
||||
>-</button>
|
||||
<button :disabled="generationCount <= 1" @click="decrementCount" class="count-button"
|
||||
>-</button
|
||||
>
|
||||
<input
|
||||
id="count-input"
|
||||
v-model="generationCount"
|
||||
@ -47,7 +41,8 @@
|
||||
:disabled="generationCount >= ARTICLE_MAX_COUNT"
|
||||
@click="incrementCount"
|
||||
class="count-button"
|
||||
>+</button>
|
||||
>+</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</transition>
|
||||
@ -67,17 +62,17 @@
|
||||
</div>
|
||||
|
||||
<div class="button-group">
|
||||
<button
|
||||
:disabled="isGenerating || isGeneratingTitle"
|
||||
@click="handleRewrite('content')"
|
||||
<button
|
||||
:disabled="isGenerating || isGeneratingTitle"
|
||||
@click="handleRewrite('content')"
|
||||
class="rewrite-button"
|
||||
>
|
||||
<span v-if="isGenerating" class="loading-spinner"></span>
|
||||
<span v-else>改写文案</span>
|
||||
</button>
|
||||
<button
|
||||
:disabled="isGenerating || isGeneratingTitle"
|
||||
@click="handleRewrite('title')"
|
||||
<button
|
||||
:disabled="isGenerating || isGeneratingTitle"
|
||||
@click="handleRewrite('title')"
|
||||
class="rewrite-button title-button"
|
||||
>
|
||||
<span v-if="isGeneratingTitle" class="loading-spinner"></span>
|
||||
@ -358,7 +353,9 @@ const showToast = (message) => {
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
overflow-wrap: break-word;
|
||||
transition: border-color 0.3s, box-shadow 0.3s;
|
||||
transition:
|
||||
border-color 0.3s,
|
||||
box-shadow 0.3s;
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
|
||||
@ -465,4 +462,4 @@ const showToast = (message) => {
|
||||
padding: 16px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<transition name="fade">
|
||||
<div v-if="(results?.length > 0) || isGenerating" class="result-section">
|
||||
<div v-if="results?.length > 0 || isGenerating" class="result-section">
|
||||
<div class="result-header-bar">
|
||||
<h2 class="section-title">
|
||||
<span class="section-icon">✨</span>
|
||||
@ -25,6 +25,13 @@
|
||||
</div>
|
||||
<span class="model-badge">{{ model }}</span>
|
||||
<span class="count-badge">{{ results?.length || 0 }} 个结果</span>
|
||||
<button
|
||||
v-if="results?.length > 0 && !isGenerating"
|
||||
@click="handleCopyAll"
|
||||
class="copy-all-button"
|
||||
>
|
||||
复制全部
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -66,9 +73,6 @@
|
||||
</div>
|
||||
<div :class="{ expanded: expandedResults[index] }" class="result-content">
|
||||
{{ text }}
|
||||
<!-- <div v-if="text.length > (type === 'title' ? 20 : 900)" class="warning-badge">
|
||||
超出字数限制
|
||||
</div> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -87,7 +91,12 @@
|
||||
<script setup>
|
||||
import { ref, reactive } from 'vue'
|
||||
|
||||
const { results = [], isGenerating, model, layoutMode } = defineProps({
|
||||
const {
|
||||
results = [],
|
||||
isGenerating,
|
||||
model,
|
||||
layoutMode
|
||||
} = defineProps({
|
||||
results: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
@ -130,6 +139,19 @@ const toggleExpand = (index) => {
|
||||
expandedResults[index] = !expandedResults[index]
|
||||
}
|
||||
|
||||
const handleCopyAll = () => {
|
||||
const allText = results.map((text, index) => `结果 #${index + 1}:\n${text}`).join('\n\n')
|
||||
navigator.clipboard
|
||||
.writeText(allText)
|
||||
.then(() => {
|
||||
showToast('已复制全部内容')
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error('复制失败:', err)
|
||||
showToast('复制失败,请重试')
|
||||
})
|
||||
}
|
||||
|
||||
const showToast = (message) => {
|
||||
const toast = document.createElement('div')
|
||||
toast.className = 'toast-message'
|
||||
@ -474,7 +496,9 @@ const showToast = (message) => {
|
||||
|
||||
.fade-enter-active,
|
||||
.fade-leave-active {
|
||||
transition: opacity 0.3s, transform 0.3s;
|
||||
transition:
|
||||
opacity 0.3s,
|
||||
transform 0.3s;
|
||||
}
|
||||
|
||||
.fade-enter-from,
|
||||
@ -540,4 +564,21 @@ const showToast = (message) => {
|
||||
border-radius: 4px;
|
||||
font-size: 12px;
|
||||
}
|
||||
</style>
|
||||
|
||||
.copy-all-button {
|
||||
background-color: #2ecc71;
|
||||
color: white;
|
||||
border: none;
|
||||
padding: 6px 12px;
|
||||
border-radius: 20px;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.copy-all-button:hover {
|
||||
background-color: #27ae60;
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
</style>
|
||||
|
||||
221
lingtropy-client/src/renderer/components/UpdateChecker.vue
Normal file
221
lingtropy-client/src/renderer/components/UpdateChecker.vue
Normal file
@ -0,0 +1,221 @@
|
||||
<template>
|
||||
<div v-if="showUpdateDialog" class="update-dialog">
|
||||
<div class="update-content">
|
||||
<div class="update-header">
|
||||
<span class="update-icon">🔄</span>
|
||||
<h3>发现新版本</h3>
|
||||
</div>
|
||||
<div class="update-info">
|
||||
<p>当前版本: {{ currentVersion }}</p>
|
||||
<p>最新版本: {{ latestVersion }}</p>
|
||||
<div class="update-notes" v-if="releaseNotes">
|
||||
<h4>更新内容:</h4>
|
||||
<div class="release-notes-wrapper">
|
||||
<p
|
||||
v-for="(note, index) in processedReleaseNotes"
|
||||
:key="index"
|
||||
class="release-note-item"
|
||||
>
|
||||
{{ note }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="update-actions">
|
||||
<button class="update-button" @click="startUpdate" :disabled="isUpdating">
|
||||
{{ isUpdating ? '正在更新...' : '立即更新' }}
|
||||
</button>
|
||||
<button class="later-button" @click="closeDialog" :disabled="isUpdating"> 稍后提醒 </button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted, computed } from 'vue'
|
||||
|
||||
const showUpdateDialog = ref(false)
|
||||
const currentVersion = ref('')
|
||||
const latestVersion = ref('')
|
||||
const releaseNotes = ref('')
|
||||
const isUpdating = ref(false)
|
||||
|
||||
// 将HTML格式的更新内容转换为纯文本列表
|
||||
const processedReleaseNotes = computed(() => {
|
||||
if (!releaseNotes.value) return []
|
||||
|
||||
// 创建一个临时DOM元素来解析HTML内容
|
||||
const temp = document.createElement('div')
|
||||
temp.innerHTML = releaseNotes.value
|
||||
|
||||
// 获取纯文本内容
|
||||
const textContent = temp.textContent || temp.innerText || ''
|
||||
|
||||
// 按行分割
|
||||
return textContent
|
||||
.split('\n')
|
||||
.map((line) => line.trim())
|
||||
.filter((line) => line.length > 0)
|
||||
})
|
||||
|
||||
const checkForUpdates = async () => {
|
||||
try {
|
||||
console.log('checkForUpdates')
|
||||
const updateInfo = await window.mainApi.invoke('check-for-updates')
|
||||
console.log('updateInfo', updateInfo)
|
||||
if (updateInfo.hasUpdate) {
|
||||
currentVersion.value = updateInfo.currentVersion
|
||||
latestVersion.value = updateInfo.latestVersion
|
||||
releaseNotes.value = updateInfo.releaseNotes
|
||||
showUpdateDialog.value = true
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('检查更新失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
const startUpdate = async () => {
|
||||
isUpdating.value = true
|
||||
try {
|
||||
await window.mainApi.invoke('start-update')
|
||||
} catch (error) {
|
||||
console.error('更新失败:', error)
|
||||
isUpdating.value = false
|
||||
}
|
||||
}
|
||||
|
||||
const closeDialog = () => {
|
||||
showUpdateDialog.value = false
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
checkForUpdates()
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.update-dialog {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.update-content {
|
||||
background-color: white;
|
||||
border-radius: 16px;
|
||||
padding: 24px;
|
||||
width: 90%;
|
||||
max-width: 500px;
|
||||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
|
||||
.update-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.update-icon {
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
.update-header h3 {
|
||||
margin: 0;
|
||||
color: #333;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.update-info {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.update-info p {
|
||||
margin: 8px 0;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.update-notes {
|
||||
margin-top: 16px;
|
||||
padding: 12px;
|
||||
background-color: #f5f5f5;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.update-notes h4 {
|
||||
margin: 0 0 8px 0;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.release-notes-wrapper {
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.release-note-item {
|
||||
margin: 6px 0;
|
||||
padding-left: 16px;
|
||||
position: relative;
|
||||
color: #555;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.release-note-item::before {
|
||||
content: '•';
|
||||
position: absolute;
|
||||
left: 4px;
|
||||
color: #2ecc71;
|
||||
}
|
||||
|
||||
.update-actions {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.update-button,
|
||||
.later-button {
|
||||
padding: 8px 16px;
|
||||
border-radius: 8px;
|
||||
border: none;
|
||||
font-size: 14px;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.update-button {
|
||||
background-color: #2ecc71;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.update-button:hover:not(:disabled) {
|
||||
background-color: #27ae60;
|
||||
}
|
||||
|
||||
.update-button:disabled {
|
||||
background-color: #95a5a6;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.later-button {
|
||||
background-color: #f0f0f0;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.later-button:hover:not(:disabled) {
|
||||
background-color: #e0e0e0;
|
||||
}
|
||||
|
||||
.later-button:disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
</style>
|
||||
@ -2,7 +2,7 @@
|
||||
<div class="text-rewriter-container">
|
||||
<div class="text-rewriter-layout">
|
||||
<DisclaimerComponent />
|
||||
<InputSection
|
||||
<InputSection
|
||||
:is-generating="isGenerating"
|
||||
:is-generating-title="isGeneratingTitle"
|
||||
v-model:model="currentModel"
|
||||
@ -14,8 +14,9 @@
|
||||
:model="currentModel"
|
||||
:layout-mode="layoutMode"
|
||||
:type="currentType"
|
||||
@update:layout="(newLayout) => layoutMode = newLayout"
|
||||
@update:layout="(newLayout) => (layoutMode = newLayout)"
|
||||
/>
|
||||
<!-- <UpdateChecker /> -->
|
||||
</div>
|
||||
<h1></h1>
|
||||
<FooterComponent />
|
||||
@ -28,6 +29,7 @@ import DisclaimerComponent from '../components/DisclaimerComponent.vue'
|
||||
import InputSection from '../components/InputSection.vue'
|
||||
import ResultSection from '../components/ResultSection.vue'
|
||||
import FooterComponent from '../components/FooterComponent.vue'
|
||||
// import UpdateChecker from '../components/UpdateChecker.vue'
|
||||
|
||||
const rewrittenText = ref([])
|
||||
const isGenerating = ref(false)
|
||||
@ -72,12 +74,45 @@ const handleRewrite = async ({ mode, text, count, model, key, type }) => {
|
||||
|
||||
try {
|
||||
const baseUrl = await window.mainApi.invoke('getBaseUrl')
|
||||
|
||||
window.mainApi.on('openai-partial-response', (_, { index, content }) => {
|
||||
|
||||
window.mainApi.on('openai-partial-response', (_, responseData) => {
|
||||
const { index, content, status, error } = responseData
|
||||
|
||||
// 初始化结果数组
|
||||
if (!rewrittenText.value[index]) {
|
||||
rewrittenText.value[index] = ''
|
||||
}
|
||||
rewrittenText.value[index] += content
|
||||
|
||||
// 如果有内容就追加
|
||||
if (content) {
|
||||
rewrittenText.value[index] += content
|
||||
}
|
||||
|
||||
// 处理错误信息
|
||||
if (error) {
|
||||
console.error(`生成ID ${index} 错误: ${error}`)
|
||||
// 在UI中显示错误信息
|
||||
rewrittenText.value[index] += ` [错误: ${error}]`
|
||||
showToast(`生成时出现错误: ${error}`)
|
||||
}
|
||||
// 如果有状态信息(如完成原因),可以在控制台记录或向用户展示
|
||||
else if (status) {
|
||||
console.log(`生成ID ${index} 状态: ${status}`)
|
||||
// 可以在UI中标记这个状态
|
||||
if (status === 'stop' || status === 'complete') {
|
||||
// 正常停止,不需要特殊处理
|
||||
console.log(`生成ID ${index} 已完成`)
|
||||
} else if (status === 'length') {
|
||||
// 因长度限制停止
|
||||
rewrittenText.value[index] += ' [已达到长度限制]'
|
||||
} else if (status === 'error') {
|
||||
// 一般性错误
|
||||
rewrittenText.value[index] += ' [发生错误]'
|
||||
} else {
|
||||
// 其他原因
|
||||
rewrittenText.value[index] += ` [${status}]`
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
const results = await window.mainApi.invoke(
|
||||
@ -104,22 +139,48 @@ const handleRewrite = async ({ mode, text, count, model, key, type }) => {
|
||||
|
||||
try {
|
||||
const baseUrl = await window.mainApi.invoke('getBaseUrl')
|
||||
|
||||
window.mainApi.on('openai-partial-response', (_, { index, content }) => {
|
||||
|
||||
window.mainApi.on('openai-partial-response', (_, responseData) => {
|
||||
const { index, content, status, error } = responseData
|
||||
|
||||
// 初始化结果数组
|
||||
if (!rewrittenText.value[index]) {
|
||||
rewrittenText.value[index] = ''
|
||||
}
|
||||
rewrittenText.value[index] += content
|
||||
|
||||
// 如果有内容就追加
|
||||
if (content) {
|
||||
rewrittenText.value[index] += content
|
||||
}
|
||||
|
||||
// 处理错误信息
|
||||
if (error) {
|
||||
console.error(`生成ID ${index} 错误: ${error}`)
|
||||
// 在UI中显示错误信息
|
||||
rewrittenText.value[index] += ` [错误: ${error}]`
|
||||
showToast(`生成时出现错误: ${error}`)
|
||||
}
|
||||
// 如果有状态信息(如完成原因),可以在控制台记录或向用户展示
|
||||
else if (status) {
|
||||
console.log(`生成ID ${index} 状态: ${status}`)
|
||||
// 可以在UI中标记这个状态
|
||||
if (status === 'stop' || status === 'complete') {
|
||||
// 正常停止,不需要特殊处理
|
||||
console.log(`生成ID ${index} 已完成`)
|
||||
} else if (status === 'length') {
|
||||
// 因长度限制停止
|
||||
rewrittenText.value[index] += ' [已达到长度限制]'
|
||||
} else if (status === 'error') {
|
||||
// 一般性错误
|
||||
rewrittenText.value[index] += ' [发生错误]'
|
||||
} else {
|
||||
// 其他原因
|
||||
rewrittenText.value[index] += ` [${status}]`
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
const results = await window.mainApi.invoke(
|
||||
'call-openai',
|
||||
baseUrl,
|
||||
key,
|
||||
model,
|
||||
count,
|
||||
text
|
||||
)
|
||||
const results = await window.mainApi.invoke('call-openai', baseUrl, key, model, count, text)
|
||||
|
||||
results.forEach(({ index, response }) => {
|
||||
rewrittenText.value[index] = response
|
||||
@ -142,7 +203,8 @@ watch(layoutMode, (newLayout) => {
|
||||
|
||||
<style scoped>
|
||||
.text-rewriter-container {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||
font-family:
|
||||
-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: flex-start;
|
||||
|
||||
@ -3339,7 +3339,7 @@ lie@~3.3.0:
|
||||
immediate "~3.0.5"
|
||||
|
||||
"lingtropy@file:":
|
||||
version "1.0.2"
|
||||
version "1.0.3"
|
||||
resolved "file:"
|
||||
dependencies:
|
||||
"@mdi/font" "^7.4.47"
|
||||
@ -3354,7 +3354,7 @@ lie@~3.3.0:
|
||||
vuetify "^3.7.14"
|
||||
|
||||
"lingtropy2@file:":
|
||||
version "1.0.2"
|
||||
version "1.0.3"
|
||||
resolved "file:"
|
||||
dependencies:
|
||||
"@mdi/font" "^7.4.47"
|
||||
|
||||
851
package-lock.json
generated
Normal file
851
package-lock.json
generated
Normal file
@ -0,0 +1,851 @@
|
||||
{
|
||||
"name": "LingTropy",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"electron-store": "^10.0.1",
|
||||
"electron-updater": "^6.6.2",
|
||||
"openai": "^4.87.4",
|
||||
"typescript": "^5.8.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/electron-store": "^3.2.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/electron-store": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/electron-store/-/electron-store-3.2.2.tgz",
|
||||
"integrity": "sha512-N3X45mnsfnwmeZoXSZmeE7/Tne8kdbIKO1vQdbbEV04TzrMbWIeDVJJjnX2n5GH9O61zI612tet4s2jCZ55DXw==",
|
||||
"deprecated": "This is a stub types definition. electron-store provides its own type definitions, so you do not need this installed.",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"electron-store": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "18.19.80",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.80.tgz",
|
||||
"integrity": "sha512-kEWeMwMeIvxYkeg1gTc01awpwLbfMRZXdIhwRcakd/KlK53jmRC26LqcbIt7fnAQTu5GzlnWmzA3H6+l1u6xxQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"undici-types": "~5.26.4"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/node-fetch": {
|
||||
"version": "2.6.12",
|
||||
"resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz",
|
||||
"integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/node": "*",
|
||||
"form-data": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/node-fetch/node_modules/@types/node": {
|
||||
"version": "22.13.10",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz",
|
||||
"integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"undici-types": "~6.20.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/node-fetch/node_modules/undici-types": {
|
||||
"version": "6.20.0",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
|
||||
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/abort-controller": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
|
||||
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"event-target-shim": "^5.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.5"
|
||||
}
|
||||
},
|
||||
"node_modules/agentkeepalive": {
|
||||
"version": "4.6.0",
|
||||
"resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz",
|
||||
"integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"humanize-ms": "^1.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 8.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/ajv": {
|
||||
"version": "8.17.1",
|
||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
|
||||
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"fast-deep-equal": "^3.1.3",
|
||||
"fast-uri": "^3.0.1",
|
||||
"json-schema-traverse": "^1.0.0",
|
||||
"require-from-string": "^2.0.2"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/epoberezkin"
|
||||
}
|
||||
},
|
||||
"node_modules/ajv-formats": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
|
||||
"integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ajv": "^8.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"ajv": "^8.0.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"ajv": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/argparse": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
|
||||
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
|
||||
"license": "Python-2.0"
|
||||
},
|
||||
"node_modules/asynckit": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/atomically": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/atomically/-/atomically-2.0.3.tgz",
|
||||
"integrity": "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==",
|
||||
"dependencies": {
|
||||
"stubborn-fs": "^1.2.5",
|
||||
"when-exit": "^2.1.1"
|
||||
}
|
||||
},
|
||||
"node_modules/builder-util-runtime": {
|
||||
"version": "9.3.1",
|
||||
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.3.1.tgz",
|
||||
"integrity": "sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"debug": "^4.3.4",
|
||||
"sax": "^1.2.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/call-bind-apply-helpers": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
|
||||
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/combined-stream": {
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
||||
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"delayed-stream": "~1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/conf": {
|
||||
"version": "13.1.0",
|
||||
"resolved": "https://registry.npmjs.org/conf/-/conf-13.1.0.tgz",
|
||||
"integrity": "sha512-Bi6v586cy1CoTFViVO4lGTtx780lfF96fUmS1lSX6wpZf6330NvHUu6fReVuDP1de8Mg0nkZb01c8tAQdz1o3w==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ajv": "^8.17.1",
|
||||
"ajv-formats": "^3.0.1",
|
||||
"atomically": "^2.0.3",
|
||||
"debounce-fn": "^6.0.0",
|
||||
"dot-prop": "^9.0.0",
|
||||
"env-paths": "^3.0.0",
|
||||
"json-schema-typed": "^8.0.1",
|
||||
"semver": "^7.6.3",
|
||||
"uint8array-extras": "^1.4.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/debounce-fn": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-6.0.0.tgz",
|
||||
"integrity": "sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"mimic-function": "^5.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/debug": {
|
||||
"version": "4.4.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
|
||||
"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ms": "^2.1.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"supports-color": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/delayed-stream": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/dot-prop": {
|
||||
"version": "9.0.0",
|
||||
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz",
|
||||
"integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"type-fest": "^4.18.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/dunder-proto": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
|
||||
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind-apply-helpers": "^1.0.1",
|
||||
"es-errors": "^1.3.0",
|
||||
"gopd": "^1.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/electron-store": {
|
||||
"version": "10.0.1",
|
||||
"resolved": "https://registry.npmjs.org/electron-store/-/electron-store-10.0.1.tgz",
|
||||
"integrity": "sha512-Ok0bF13WWdTzZi9rCtPN8wUfwx+yDMmV6PAnCMqjNRKEXHmklW/rV+6DofV/Vf5qoAh+Bl9Bj7dQ+0W+IL2psg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"conf": "^13.0.0",
|
||||
"type-fest": "^4.20.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/electron-updater": {
|
||||
"version": "6.6.2",
|
||||
"resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.6.2.tgz",
|
||||
"integrity": "sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"builder-util-runtime": "9.3.1",
|
||||
"fs-extra": "^10.1.0",
|
||||
"js-yaml": "^4.1.0",
|
||||
"lazy-val": "^1.0.5",
|
||||
"lodash.escaperegexp": "^4.1.2",
|
||||
"lodash.isequal": "^4.5.0",
|
||||
"semver": "^7.6.3",
|
||||
"tiny-typed-emitter": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/env-paths": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz",
|
||||
"integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/es-define-property": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
|
||||
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/es-errors": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
|
||||
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/es-object-atoms": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
|
||||
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"es-errors": "^1.3.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/es-set-tostringtag": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
|
||||
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"es-errors": "^1.3.0",
|
||||
"get-intrinsic": "^1.2.6",
|
||||
"has-tostringtag": "^1.0.2",
|
||||
"hasown": "^2.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/event-target-shim": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
|
||||
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/fast-deep-equal": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
||||
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/fast-uri": {
|
||||
"version": "3.0.6",
|
||||
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
|
||||
"integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/fastify"
|
||||
},
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/fastify"
|
||||
}
|
||||
],
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/form-data": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
|
||||
"integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.8",
|
||||
"es-set-tostringtag": "^2.1.0",
|
||||
"mime-types": "^2.1.12"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/form-data-encoder": {
|
||||
"version": "1.7.2",
|
||||
"resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz",
|
||||
"integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/formdata-node": {
|
||||
"version": "4.4.1",
|
||||
"resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz",
|
||||
"integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"node-domexception": "1.0.0",
|
||||
"web-streams-polyfill": "4.0.0-beta.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 12.20"
|
||||
}
|
||||
},
|
||||
"node_modules/fs-extra": {
|
||||
"version": "10.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
|
||||
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"graceful-fs": "^4.2.0",
|
||||
"jsonfile": "^6.0.1",
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/function-bind": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
||||
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/get-intrinsic": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
|
||||
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind-apply-helpers": "^1.0.2",
|
||||
"es-define-property": "^1.0.1",
|
||||
"es-errors": "^1.3.0",
|
||||
"es-object-atoms": "^1.1.1",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-proto": "^1.0.1",
|
||||
"gopd": "^1.2.0",
|
||||
"has-symbols": "^1.1.0",
|
||||
"hasown": "^2.0.2",
|
||||
"math-intrinsics": "^1.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/get-proto": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
|
||||
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"dunder-proto": "^1.0.1",
|
||||
"es-object-atoms": "^1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/gopd": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
|
||||
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/graceful-fs": {
|
||||
"version": "4.2.11",
|
||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
||||
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/has-symbols": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
|
||||
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has-tostringtag": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
|
||||
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"has-symbols": "^1.0.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/hasown": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
|
||||
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"function-bind": "^1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/humanize-ms": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
|
||||
"integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ms": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/js-yaml": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
|
||||
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"argparse": "^2.0.1"
|
||||
},
|
||||
"bin": {
|
||||
"js-yaml": "bin/js-yaml.js"
|
||||
}
|
||||
},
|
||||
"node_modules/json-schema-traverse": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
|
||||
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/json-schema-typed": {
|
||||
"version": "8.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.1.tgz",
|
||||
"integrity": "sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==",
|
||||
"license": "BSD-2-Clause"
|
||||
},
|
||||
"node_modules/jsonfile": {
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
|
||||
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"graceful-fs": "^4.1.6"
|
||||
}
|
||||
},
|
||||
"node_modules/lazy-val": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz",
|
||||
"integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lodash.escaperegexp": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
|
||||
"integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lodash.isequal": {
|
||||
"version": "4.5.0",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
|
||||
"integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
|
||||
"deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/math-intrinsics": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
|
||||
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-db": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-types": {
|
||||
"version": "2.1.35",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
||||
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"mime-db": "1.52.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/mimic-function": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
|
||||
"integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/ms": {
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
||||
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/node-domexception": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
|
||||
"integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/jimmywarting"
|
||||
},
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://paypal.me/jimmywarting"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=10.5.0"
|
||||
}
|
||||
},
|
||||
"node_modules/node-fetch": {
|
||||
"version": "2.7.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
|
||||
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"whatwg-url": "^5.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "4.x || >=6.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"encoding": "^0.1.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"encoding": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/openai": {
|
||||
"version": "4.87.4",
|
||||
"resolved": "https://registry.npmjs.org/openai/-/openai-4.87.4.tgz",
|
||||
"integrity": "sha512-lsfM20jZY4A0lNexfoUAkfmrEXxaTXvv8OKYicpeAJUNHObpRgkvC7pxPgMnB6gc9ID8OCwzzhEhBpNy69UR7w==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@types/node": "^18.11.18",
|
||||
"@types/node-fetch": "^2.6.4",
|
||||
"abort-controller": "^3.0.0",
|
||||
"agentkeepalive": "^4.2.1",
|
||||
"form-data-encoder": "1.7.2",
|
||||
"formdata-node": "^4.3.2",
|
||||
"node-fetch": "^2.6.7"
|
||||
},
|
||||
"bin": {
|
||||
"openai": "bin/cli"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"ws": "^8.18.0",
|
||||
"zod": "^3.23.8"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"ws": {
|
||||
"optional": true
|
||||
},
|
||||
"zod": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/require-from-string": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
|
||||
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sax": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
|
||||
"integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/semver": {
|
||||
"version": "7.7.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
|
||||
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
|
||||
"license": "ISC",
|
||||
"bin": {
|
||||
"semver": "bin/semver.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/stubborn-fs": {
|
||||
"version": "1.2.5",
|
||||
"resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-1.2.5.tgz",
|
||||
"integrity": "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g=="
|
||||
},
|
||||
"node_modules/tiny-typed-emitter": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz",
|
||||
"integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/tr46": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
||||
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/type-fest": {
|
||||
"version": "4.37.0",
|
||||
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.37.0.tgz",
|
||||
"integrity": "sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==",
|
||||
"license": "(MIT OR CC0-1.0)",
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/typescript": {
|
||||
"version": "5.8.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz",
|
||||
"integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
"tsserver": "bin/tsserver"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.17"
|
||||
}
|
||||
},
|
||||
"node_modules/uint8array-extras": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.0.tgz",
|
||||
"integrity": "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/undici-types": {
|
||||
"version": "5.26.5",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
|
||||
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/universalify": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
|
||||
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/web-streams-polyfill": {
|
||||
"version": "4.0.0-beta.3",
|
||||
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz",
|
||||
"integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 14"
|
||||
}
|
||||
},
|
||||
"node_modules/webidl-conversions": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
|
||||
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
|
||||
"license": "BSD-2-Clause"
|
||||
},
|
||||
"node_modules/whatwg-url": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
|
||||
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"tr46": "~0.0.3",
|
||||
"webidl-conversions": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/when-exit": {
|
||||
"version": "2.1.4",
|
||||
"resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.4.tgz",
|
||||
"integrity": "sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==",
|
||||
"license": "MIT"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,11 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"openai": "^4.87.4"
|
||||
"electron-store": "^10.0.1",
|
||||
"electron-updater": "^6.6.2",
|
||||
"openai": "^4.87.4",
|
||||
"typescript": "^5.8.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/electron-store": "^3.2.2"
|
||||
}
|
||||
}
|
||||
|
||||
308
yarn.lock
308
yarn.lock
@ -2,9 +2,16 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@types/electron-store@^3.2.2":
|
||||
version "3.2.2"
|
||||
resolved "https://registry.npmjs.org/@types/electron-store/-/electron-store-3.2.2.tgz"
|
||||
integrity sha512-N3X45mnsfnwmeZoXSZmeE7/Tne8kdbIKO1vQdbbEV04TzrMbWIeDVJJjnX2n5GH9O61zI612tet4s2jCZ55DXw==
|
||||
dependencies:
|
||||
electron-store "*"
|
||||
|
||||
"@types/node-fetch@^2.6.4":
|
||||
version "2.6.12"
|
||||
resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz#8ab5c3ef8330f13100a7479e2cd56d3386830a03"
|
||||
resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz"
|
||||
integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
@ -12,40 +19,78 @@
|
||||
|
||||
"@types/node@*":
|
||||
version "22.13.10"
|
||||
resolved "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz#df9ea358c5ed991266becc3109dc2dc9125d77e4"
|
||||
resolved "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz"
|
||||
integrity sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==
|
||||
dependencies:
|
||||
undici-types "~6.20.0"
|
||||
|
||||
"@types/node@^18.11.18":
|
||||
version "18.19.80"
|
||||
resolved "https://registry.npmjs.org/@types/node/-/node-18.19.80.tgz#6d6008e8920dddcd23f9dd33da24684ef57d487c"
|
||||
resolved "https://registry.npmjs.org/@types/node/-/node-18.19.80.tgz"
|
||||
integrity sha512-kEWeMwMeIvxYkeg1gTc01awpwLbfMRZXdIhwRcakd/KlK53jmRC26LqcbIt7fnAQTu5GzlnWmzA3H6+l1u6xxQ==
|
||||
dependencies:
|
||||
undici-types "~5.26.4"
|
||||
|
||||
abort-controller@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
|
||||
resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz"
|
||||
integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
|
||||
dependencies:
|
||||
event-target-shim "^5.0.0"
|
||||
|
||||
agentkeepalive@^4.2.1:
|
||||
version "4.6.0"
|
||||
resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a"
|
||||
resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz"
|
||||
integrity sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==
|
||||
dependencies:
|
||||
humanize-ms "^1.2.1"
|
||||
|
||||
ajv-formats@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz"
|
||||
integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==
|
||||
dependencies:
|
||||
ajv "^8.0.0"
|
||||
|
||||
ajv@^8.0.0, ajv@^8.17.1:
|
||||
version "8.17.1"
|
||||
resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz"
|
||||
integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
|
||||
dependencies:
|
||||
fast-deep-equal "^3.1.3"
|
||||
fast-uri "^3.0.1"
|
||||
json-schema-traverse "^1.0.0"
|
||||
require-from-string "^2.0.2"
|
||||
|
||||
argparse@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
|
||||
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
|
||||
|
||||
asynckit@^0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
|
||||
resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
|
||||
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
|
||||
|
||||
atomically@^2.0.3:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.npmjs.org/atomically/-/atomically-2.0.3.tgz"
|
||||
integrity sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==
|
||||
dependencies:
|
||||
stubborn-fs "^1.2.5"
|
||||
when-exit "^2.1.1"
|
||||
|
||||
builder-util-runtime@9.3.1:
|
||||
version "9.3.1"
|
||||
resolved "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.3.1.tgz"
|
||||
integrity sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ==
|
||||
dependencies:
|
||||
debug "^4.3.4"
|
||||
sax "^1.2.4"
|
||||
|
||||
call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6"
|
||||
resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz"
|
||||
integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
|
||||
dependencies:
|
||||
es-errors "^1.3.0"
|
||||
@ -53,45 +98,108 @@ call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
|
||||
|
||||
combined-stream@^1.0.8:
|
||||
version "1.0.8"
|
||||
resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
|
||||
resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
|
||||
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
|
||||
dependencies:
|
||||
delayed-stream "~1.0.0"
|
||||
|
||||
conf@^13.0.0:
|
||||
version "13.1.0"
|
||||
resolved "https://registry.npmjs.org/conf/-/conf-13.1.0.tgz"
|
||||
integrity sha512-Bi6v586cy1CoTFViVO4lGTtx780lfF96fUmS1lSX6wpZf6330NvHUu6fReVuDP1de8Mg0nkZb01c8tAQdz1o3w==
|
||||
dependencies:
|
||||
ajv "^8.17.1"
|
||||
ajv-formats "^3.0.1"
|
||||
atomically "^2.0.3"
|
||||
debounce-fn "^6.0.0"
|
||||
dot-prop "^9.0.0"
|
||||
env-paths "^3.0.0"
|
||||
json-schema-typed "^8.0.1"
|
||||
semver "^7.6.3"
|
||||
uint8array-extras "^1.4.0"
|
||||
|
||||
debounce-fn@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.npmjs.org/debounce-fn/-/debounce-fn-6.0.0.tgz"
|
||||
integrity sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==
|
||||
dependencies:
|
||||
mimic-function "^5.0.0"
|
||||
|
||||
debug@^4.3.4:
|
||||
version "4.4.0"
|
||||
resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz"
|
||||
integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
|
||||
dependencies:
|
||||
ms "^2.1.3"
|
||||
|
||||
delayed-stream@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
|
||||
resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
|
||||
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
|
||||
|
||||
dot-prop@^9.0.0:
|
||||
version "9.0.0"
|
||||
resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz"
|
||||
integrity sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==
|
||||
dependencies:
|
||||
type-fest "^4.18.2"
|
||||
|
||||
dunder-proto@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
|
||||
resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz"
|
||||
integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
|
||||
dependencies:
|
||||
call-bind-apply-helpers "^1.0.1"
|
||||
es-errors "^1.3.0"
|
||||
gopd "^1.2.0"
|
||||
|
||||
electron-store@*, electron-store@^10.0.1:
|
||||
version "10.0.1"
|
||||
resolved "https://registry.npmjs.org/electron-store/-/electron-store-10.0.1.tgz"
|
||||
integrity sha512-Ok0bF13WWdTzZi9rCtPN8wUfwx+yDMmV6PAnCMqjNRKEXHmklW/rV+6DofV/Vf5qoAh+Bl9Bj7dQ+0W+IL2psg==
|
||||
dependencies:
|
||||
conf "^13.0.0"
|
||||
type-fest "^4.20.0"
|
||||
|
||||
electron-updater@^6.6.2:
|
||||
version "6.6.2"
|
||||
resolved "https://registry.npmjs.org/electron-updater/-/electron-updater-6.6.2.tgz"
|
||||
integrity sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==
|
||||
dependencies:
|
||||
builder-util-runtime "9.3.1"
|
||||
fs-extra "^10.1.0"
|
||||
js-yaml "^4.1.0"
|
||||
lazy-val "^1.0.5"
|
||||
lodash.escaperegexp "^4.1.2"
|
||||
lodash.isequal "^4.5.0"
|
||||
semver "^7.6.3"
|
||||
tiny-typed-emitter "^2.1.0"
|
||||
|
||||
env-paths@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz"
|
||||
integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==
|
||||
|
||||
es-define-property@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
|
||||
resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz"
|
||||
integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
|
||||
|
||||
es-errors@^1.3.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
|
||||
resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz"
|
||||
integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
|
||||
|
||||
es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1"
|
||||
resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz"
|
||||
integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
|
||||
dependencies:
|
||||
es-errors "^1.3.0"
|
||||
|
||||
es-set-tostringtag@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d"
|
||||
resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz"
|
||||
integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
|
||||
dependencies:
|
||||
es-errors "^1.3.0"
|
||||
@ -101,17 +209,27 @@ es-set-tostringtag@^2.1.0:
|
||||
|
||||
event-target-shim@^5.0.0:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
|
||||
resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz"
|
||||
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
|
||||
|
||||
fast-deep-equal@^3.1.3:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
|
||||
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
|
||||
|
||||
fast-uri@^3.0.1:
|
||||
version "3.0.6"
|
||||
resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz"
|
||||
integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==
|
||||
|
||||
form-data-encoder@1.7.2:
|
||||
version "1.7.2"
|
||||
resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040"
|
||||
resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz"
|
||||
integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==
|
||||
|
||||
form-data@^4.0.0:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c"
|
||||
resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz"
|
||||
integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==
|
||||
dependencies:
|
||||
asynckit "^0.4.0"
|
||||
@ -121,20 +239,29 @@ form-data@^4.0.0:
|
||||
|
||||
formdata-node@^4.3.2:
|
||||
version "4.4.1"
|
||||
resolved "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2"
|
||||
resolved "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz"
|
||||
integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==
|
||||
dependencies:
|
||||
node-domexception "1.0.0"
|
||||
web-streams-polyfill "4.0.0-beta.3"
|
||||
|
||||
fs-extra@^10.1.0:
|
||||
version "10.1.0"
|
||||
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz"
|
||||
integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
|
||||
dependencies:
|
||||
graceful-fs "^4.2.0"
|
||||
jsonfile "^6.0.1"
|
||||
universalify "^2.0.0"
|
||||
|
||||
function-bind@^1.1.2:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
|
||||
resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
|
||||
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
|
||||
|
||||
get-intrinsic@^1.2.6:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01"
|
||||
resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz"
|
||||
integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
|
||||
dependencies:
|
||||
call-bind-apply-helpers "^1.0.2"
|
||||
@ -150,7 +277,7 @@ get-intrinsic@^1.2.6:
|
||||
|
||||
get-proto@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
|
||||
resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz"
|
||||
integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
|
||||
dependencies:
|
||||
dunder-proto "^1.0.1"
|
||||
@ -158,72 +285,123 @@ get-proto@^1.0.1:
|
||||
|
||||
gopd@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
|
||||
resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz"
|
||||
integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
|
||||
|
||||
graceful-fs@^4.1.6, graceful-fs@^4.2.0:
|
||||
version "4.2.11"
|
||||
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
|
||||
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
|
||||
|
||||
has-symbols@^1.0.3, has-symbols@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
|
||||
resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz"
|
||||
integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
|
||||
|
||||
has-tostringtag@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
|
||||
resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz"
|
||||
integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
|
||||
dependencies:
|
||||
has-symbols "^1.0.3"
|
||||
|
||||
hasown@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
|
||||
resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"
|
||||
integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
|
||||
dependencies:
|
||||
function-bind "^1.1.2"
|
||||
|
||||
humanize-ms@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
|
||||
resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz"
|
||||
integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==
|
||||
dependencies:
|
||||
ms "^2.0.0"
|
||||
|
||||
js-yaml@^4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz"
|
||||
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
|
||||
dependencies:
|
||||
argparse "^2.0.1"
|
||||
|
||||
json-schema-traverse@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz"
|
||||
integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
|
||||
|
||||
json-schema-typed@^8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.1.tgz"
|
||||
integrity sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==
|
||||
|
||||
jsonfile@^6.0.1:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz"
|
||||
integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
|
||||
dependencies:
|
||||
universalify "^2.0.0"
|
||||
optionalDependencies:
|
||||
graceful-fs "^4.1.6"
|
||||
|
||||
lazy-val@^1.0.5:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz"
|
||||
integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==
|
||||
|
||||
lodash.escaperegexp@^4.1.2:
|
||||
version "4.1.2"
|
||||
resolved "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz"
|
||||
integrity sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==
|
||||
|
||||
lodash.isequal@^4.5.0:
|
||||
version "4.5.0"
|
||||
resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz"
|
||||
integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
|
||||
|
||||
math-intrinsics@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
|
||||
resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz"
|
||||
integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
|
||||
|
||||
mime-db@1.52.0:
|
||||
version "1.52.0"
|
||||
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
|
||||
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
|
||||
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
|
||||
|
||||
mime-types@^2.1.12:
|
||||
version "2.1.35"
|
||||
resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
|
||||
resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
|
||||
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
|
||||
dependencies:
|
||||
mime-db "1.52.0"
|
||||
|
||||
ms@^2.0.0:
|
||||
mimic-function@^5.0.0:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz"
|
||||
integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==
|
||||
|
||||
ms@^2.0.0, ms@^2.1.3:
|
||||
version "2.1.3"
|
||||
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
|
||||
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
|
||||
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
|
||||
|
||||
node-domexception@1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5"
|
||||
resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz"
|
||||
integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
|
||||
|
||||
node-fetch@^2.6.7:
|
||||
version "2.7.0"
|
||||
resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
|
||||
resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz"
|
||||
integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
|
||||
dependencies:
|
||||
whatwg-url "^5.0.0"
|
||||
|
||||
openai@^4.87.4:
|
||||
version "4.87.4"
|
||||
resolved "https://registry.npmjs.org/openai/-/openai-4.87.4.tgz#f9d8da366a1ded2c7aa92cb9f2256755d0e58902"
|
||||
resolved "https://registry.npmjs.org/openai/-/openai-4.87.4.tgz"
|
||||
integrity sha512-lsfM20jZY4A0lNexfoUAkfmrEXxaTXvv8OKYicpeAJUNHObpRgkvC7pxPgMnB6gc9ID8OCwzzhEhBpNy69UR7w==
|
||||
dependencies:
|
||||
"@types/node" "^18.11.18"
|
||||
@ -234,35 +412,85 @@ openai@^4.87.4:
|
||||
formdata-node "^4.3.2"
|
||||
node-fetch "^2.6.7"
|
||||
|
||||
require-from-string@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz"
|
||||
integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
|
||||
|
||||
sax@^1.2.4:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz"
|
||||
integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==
|
||||
|
||||
semver@^7.6.3:
|
||||
version "7.7.1"
|
||||
resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz"
|
||||
integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
|
||||
|
||||
stubborn-fs@^1.2.5:
|
||||
version "1.2.5"
|
||||
resolved "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-1.2.5.tgz"
|
||||
integrity sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==
|
||||
|
||||
tiny-typed-emitter@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz"
|
||||
integrity sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==
|
||||
|
||||
tr46@~0.0.3:
|
||||
version "0.0.3"
|
||||
resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
|
||||
resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz"
|
||||
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
|
||||
|
||||
type-fest@^4.18.2, type-fest@^4.20.0:
|
||||
version "4.37.0"
|
||||
resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.37.0.tgz"
|
||||
integrity sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==
|
||||
|
||||
typescript@^5.8.2:
|
||||
version "5.8.2"
|
||||
resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz"
|
||||
integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==
|
||||
|
||||
uint8array-extras@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.0.tgz"
|
||||
integrity sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==
|
||||
|
||||
undici-types@~5.26.4:
|
||||
version "5.26.5"
|
||||
resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
|
||||
resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz"
|
||||
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
|
||||
|
||||
undici-types@~6.20.0:
|
||||
version "6.20.0"
|
||||
resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433"
|
||||
resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz"
|
||||
integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==
|
||||
|
||||
universalify@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz"
|
||||
integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
|
||||
|
||||
web-streams-polyfill@4.0.0-beta.3:
|
||||
version "4.0.0-beta.3"
|
||||
resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38"
|
||||
resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz"
|
||||
integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==
|
||||
|
||||
webidl-conversions@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
|
||||
resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz"
|
||||
integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
|
||||
|
||||
whatwg-url@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
|
||||
resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz"
|
||||
integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
|
||||
dependencies:
|
||||
tr46 "~0.0.3"
|
||||
webidl-conversions "^3.0.0"
|
||||
|
||||
when-exit@^2.1.1:
|
||||
version "2.1.4"
|
||||
resolved "https://registry.npmjs.org/when-exit/-/when-exit-2.1.4.tgz"
|
||||
integrity sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==
|
||||
|
||||
Loading…
Reference in New Issue
Block a user