增加复制全部的按钮
This commit is contained in:
parent
03e1e5662d
commit
7c64f310c9
@ -1,5 +1,9 @@
|
||||
# LingTropy
|
||||
|
||||
LingTropy 是一个基于 Electron + Vue3 开发的桌面应用,用于文案和标题的智能改写。
|
||||
|
||||
|
||||
|
||||
减小包体
|
||||
yarn global add depcheck
|
||||
depcheck
|
||||
|
||||
@ -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()
|
||||
/*
|
||||
@ -123,7 +117,14 @@ export default class IPCs {
|
||||
|
||||
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 +140,8 @@ export default class IPCs {
|
||||
messages: [
|
||||
{
|
||||
role: 'system',
|
||||
content: '你是一个小红书标题写手,能够熟练地根据用户的输入,改写成内容相近,但表达方式不同的新标题。你的标题中需要具备吸人眼球的钩子,能够牢牢抓住用户的注意力。请直接输出新的标题,不要输出其他任何提示性词语, 以纯文本的形式输出。注意:输出的标题不要超过20字。'
|
||||
content:
|
||||
'你是一个小红书标题写手,能够熟练地根据用户的输入,改写成内容相近,但表达方式不同的新标题。你的标题中需要具备吸人眼球的钩子,能够牢牢抓住用户的注意力。请直接输出新的标题,不要输出其他任何提示性词语, 以纯文本的形式输出。注意:输出的标题不要超过20字。'
|
||||
},
|
||||
{ role: 'user', content: text }
|
||||
],
|
||||
@ -203,7 +205,5 @@ export default class IPCs {
|
||||
})
|
||||
return dialogResult
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -49,4 +49,4 @@
|
||||
font-size: 17px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</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>
|
||||
|
||||
@ -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,10 +14,10 @@
|
||||
:model="currentModel"
|
||||
:layout-mode="layoutMode"
|
||||
:type="currentType"
|
||||
@update:layout="(newLayout) => layoutMode = newLayout"
|
||||
@update:layout="(newLayout) => (layoutMode = newLayout)"
|
||||
/>
|
||||
</div>
|
||||
<h1></h1>
|
||||
|
||||
<FooterComponent />
|
||||
</div>
|
||||
</template>
|
||||
@ -72,7 +72,7 @@ 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 }) => {
|
||||
if (!rewrittenText.value[index]) {
|
||||
rewrittenText.value[index] = ''
|
||||
@ -104,7 +104,7 @@ 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 }) => {
|
||||
if (!rewrittenText.value[index]) {
|
||||
rewrittenText.value[index] = ''
|
||||
@ -112,14 +112,7 @@ const handleRewrite = async ({ mode, text, count, model, key, type }) => {
|
||||
rewrittenText.value[index] += content
|
||||
})
|
||||
|
||||
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 +135,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;
|
||||
|
||||
@ -1,5 +1,10 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"openai": "^4.87.4"
|
||||
"electron-store": "^10.0.1",
|
||||
"openai": "^4.87.4",
|
||||
"typescript": "^5.8.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/electron-store": "^3.2.2"
|
||||
}
|
||||
}
|
||||
|
||||
134
yarn.lock
134
yarn.lock
@ -2,6 +2,13 @@
|
||||
# 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#f10c0e2eb12555968aa2815ce4baea2af39d4801"
|
||||
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"
|
||||
@ -38,11 +45,36 @@ agentkeepalive@^4.2.1:
|
||||
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#3d5dc762bca17679c3c2ea7e90ad6b7532309578"
|
||||
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#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6"
|
||||
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"
|
||||
|
||||
asynckit@^0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
|
||||
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#27e47bbe39994d324918491ba7c0edb7783e56cb"
|
||||
integrity sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==
|
||||
dependencies:
|
||||
stubborn-fs "^1.2.5"
|
||||
when-exit "^2.1.1"
|
||||
|
||||
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"
|
||||
@ -58,11 +90,40 @@ combined-stream@^1.0.8:
|
||||
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#c6e797d6157253c1baac3788bb121f2ee085f902"
|
||||
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#558169aed853eb3cf3a17c0a2438e1a91a7ba44f"
|
||||
integrity sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==
|
||||
dependencies:
|
||||
mimic-function "^5.0.0"
|
||||
|
||||
delayed-stream@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
|
||||
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#bae5982fe6dc6b8fddb92efef4f2ddff26779e92"
|
||||
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"
|
||||
@ -72,6 +133,19 @@ dunder-proto@^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#d6c0395a3f25be6686f89738d95f6e7b7864da6a"
|
||||
integrity sha512-Ok0bF13WWdTzZi9rCtPN8wUfwx+yDMmV6PAnCMqjNRKEXHmklW/rV+6DofV/Vf5qoAh+Bl9Bj7dQ+0W+IL2psg==
|
||||
dependencies:
|
||||
conf "^13.0.0"
|
||||
type-fest "^4.20.0"
|
||||
|
||||
env-paths@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da"
|
||||
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"
|
||||
@ -104,6 +178,16 @@ event-target-shim@^5.0.0:
|
||||
resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
|
||||
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#3a7d56b559d6cbc3eb512325244e619a65c6c525"
|
||||
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#88f130b77cfaea2378d56bf970dea21257a68748"
|
||||
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"
|
||||
@ -187,6 +271,16 @@ humanize-ms@^1.2.1:
|
||||
dependencies:
|
||||
ms "^2.0.0"
|
||||
|
||||
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#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
|
||||
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#826ee39e3b6cef536f85412ff048d3ff6f19dfa0"
|
||||
integrity sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==
|
||||
|
||||
math-intrinsics@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
|
||||
@ -204,6 +298,11 @@ mime-types@^2.1.12:
|
||||
dependencies:
|
||||
mime-db "1.52.0"
|
||||
|
||||
mimic-function@^5.0.0:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076"
|
||||
integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==
|
||||
|
||||
ms@^2.0.0:
|
||||
version "2.1.3"
|
||||
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
|
||||
@ -234,11 +333,41 @@ 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#89a7fdd938261267318eafe14f9c32e598c36909"
|
||||
integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
|
||||
|
||||
semver@^7.6.3:
|
||||
version "7.7.1"
|
||||
resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
|
||||
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#e5e244223166921ddf66ed5e062b6b3bf285bfd2"
|
||||
integrity sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==
|
||||
|
||||
tr46@~0.0.3:
|
||||
version "0.0.3"
|
||||
resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
|
||||
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#7cf008bf77b63a33f7ca014fa2a3f09fd69e8937"
|
||||
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#8170b3702f74b79db2e5a96207c15e65807999e4"
|
||||
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#e42a678a6dd335ec2d21661333ed42f44ae7cc74"
|
||||
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"
|
||||
@ -266,3 +395,8 @@ whatwg-url@^5.0.0:
|
||||
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#e2a0e998f7ad67eb0d2ce37e9794386663cc96f7"
|
||||
integrity sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==
|
||||
|
||||
Loading…
Reference in New Issue
Block a user