Compare commits

...

2 Commits

Author SHA1 Message Date
eb5025774f 6 2025-07-26 15:56:45 +08:00
7c64f310c9 增加复制全部的按钮 2025-04-12 21:14:17 +08:00
20 changed files with 2027 additions and 133 deletions

View File

@ -1,5 +1,9 @@
# LingTropy
LingTropy 是一个基于 Electron + Vue3 开发的桌面应用,用于文案和标题的智能改写。
减小包体
yarn global add depcheck
depcheck

View File

@ -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",

View File

@ -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": "沈阳泠启网络科技有限公司",

View 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'

View 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()

View File

@ -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
// 存储键名

View File

@ -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 = ''
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 = ''
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
})
}
}

View File

@ -1,11 +1,16 @@
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 () => {
// 注册更新处理器
registerUpdateHandlers()
app.whenReady().then(async () => {
try {
if (Constants.IS_DEV_ENV) {
import('./index.dev')
}
@ -19,7 +24,12 @@ app.on('ready', async () => {
*/
mainWindow = await createMainWindow()
// mainWindow.setTile("23")
setMainWindow(mainWindow)
setupUpdateListeners()
} catch (error) {
console.error('创建主窗口失败:', error)
errorWindow = await createErrorWindow(errorWindow, mainWindow)
}
})
app.on('activate', async () => {

View 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
}

View File

@ -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']

View File

@ -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>

View File

@ -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>
@ -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;
}

View File

@ -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;
}
.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>

View 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 []
// DOMHTML
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>

View File

@ -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)
@ -73,11 +75,44 @@ 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] = ''
}
//
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(
@ -105,21 +140,47 @@ 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] = ''
}
//
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;

View File

@ -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
View 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"
}
}
}

View File

@ -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
View File

@ -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==