Feat: handle decode errors (#425)

* show decode error

* handle loading error in post audio/recording

* tweak

* upgrade deps

* fix logout

* update build-enjoy-app.yml
This commit is contained in:
an-lee
2024-03-18 18:53:16 +08:00
committed by GitHub
parent 251eada86b
commit 3b770eaf3e
11 changed files with 441 additions and 100 deletions

View File

@@ -1,19 +1,13 @@
name: Build Enjoy App
on:
workflow_dispatch:
inputs:
os:
type: choice
description: Choose os
options:
- macos-12
- macos-14
- windows-latest
- ubuntu-latest
jobs:
build:
runs-on: ${{ github.event.inputs.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macos-12, macos-14, windows-latest, ubuntu-latest]
steps:
- uses: actions/checkout@v4
@@ -31,13 +25,13 @@ jobs:
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
with:
path: "**/node_modules"
key: ${{ github.event.inputs.os }}-${{ hashFiles('**/yarn.lock') }}
key: ${{ matrix.os }}-${{ hashFiles('**/yarn.lock') }}
- name: Install dependencies
run: yarn install
- name: Install Apple certificate
if: contains(github.event.inputs.os, 'macos')
if: contains(matrix.os, 'macos')
env:
MACOS_CERTIFICATE_APPLICATION_BASE64: ${{ secrets.MACOS_CERTIFICATE_APPLICATION_BASE64 }}
MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }}
@@ -54,7 +48,7 @@ jobs:
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: Enjoy-${{ runner.os }}-${{ github.event.inputs.os == 'macos-14' && 'arm64' || 'x64' }}-build-${{ github.ref_name }}-${{ steps.current-time.outputs.formattedTime }}
name: Enjoy-${{ runner.os }}-${{ matrix.os == 'macos-14' && 'arm64' || 'x64' }}-build-${{ github.ref_name }}-${{ steps.current-time.outputs.formattedTime }}
path: |
enjoy/out/make/**/*.deb
enjoy/out/make/**/*.rpm

View File

@@ -49,7 +49,7 @@
"@types/intl-tel-input": "^18.1.4",
"@types/lodash": "^4.17.0",
"@types/mark.js": "^8.11.12",
"@types/node": "^20.11.27",
"@types/node": "^20.11.28",
"@types/react": "^18.2.66",
"@types/react-dom": "^18.2.22",
"@types/validator": "^13.11.9",
@@ -66,7 +66,7 @@
"flora-colossus": "^2.0.0",
"octokit": "^3.1.2",
"progress": "^2.0.3",
"tailwind-merge": "^2.2.1",
"tailwind-merge": "^2.2.2",
"tailwind-scrollbar": "^3.1.0",
"tailwindcss": "^3.4.1",
"tailwindcss-animate": "^1.0.7",
@@ -82,7 +82,7 @@
"@ffmpeg/ffmpeg": "^0.12.10",
"@ffmpeg/util": "^0.12.1",
"@hookform/resolvers": "^3.3.4",
"@langchain/community": "^0.0.39",
"@langchain/community": "^0.0.40",
"@langchain/google-genai": "^0.0.10",
"@mozilla/readability": "^0.5.0",
"@radix-ui/react-accordion": "^1.1.2",
@@ -110,7 +110,7 @@
"@uidotdev/usehooks": "^2.4.1",
"@vidstack/react": "^1.10.9",
"autosize": "^6.0.1",
"axios": "^1.6.7",
"axios": "^1.6.8",
"camelcase": "^8.0.0",
"camelcase-keys": "^9.1.3",
"chart.js": "^4.4.2",
@@ -135,7 +135,7 @@
"html-to-text": "^9.0.5",
"https-proxy-agent": "^7.0.4",
"i18next": "^23.10.1",
"intl-tel-input": "^19.5.7",
"intl-tel-input": "^20.0.3",
"js-md5": "^0.8.3",
"langchain": "^0.1.28",
"lodash": "^4.17.21",
@@ -143,14 +143,14 @@
"mark.js": "^8.11.1",
"microsoft-cognitiveservices-speech-sdk": "^1.36.0",
"next-themes": "^0.3.0",
"openai": "^4.29.0",
"openai": "^4.29.1",
"pitchfinder": "^2.3.2",
"postcss": "^8.4.35",
"postcss": "^8.4.36",
"proxy-agent": "^6.4.0",
"react": "^18.2.0",
"react-activity-calendar": "^2.2.8",
"react-dom": "^18.2.0",
"react-hook-form": "^7.51.0",
"react-hook-form": "^7.51.1",
"react-hotkeys-hook": "^4.5.0",
"react-i18next": "^14.1.0",
"react-markdown": "^9.0.1",

View File

@@ -474,6 +474,7 @@
"resolvingDownloadUrl": "Resolving download URL",
"waveformIsDecoded": "Waveform is decoded",
"decodingWaveform": "Decoding waveform",
"failedToDecodeWaveform": "Failed to decode waveform",
"transcribedSuccessfully": "Transcribed successfully",
"transcribing": "Transcribing",
"notTranscribedYet": "Not transcribed yet",

View File

@@ -473,6 +473,7 @@
"resolvingDownloadUrl": "正在解析下载地址",
"waveformIsDecoded": "波形已解码",
"decodingWaveform": "正在解码波形",
"failedToDecodeWaveform": "解码波形失败",
"transcribedSuccessfully": "语音转文本成功",
"transcribing": "正在语音转文本",
"notTranscribedYet": "尚未语音转文本",

View File

@@ -15,7 +15,7 @@ import {
PingPoint,
Progress,
} from "@renderer/components/ui";
import { CheckCircleIcon, LoaderIcon } from "lucide-react";
import { CheckCircleIcon, LoaderIcon, XCircleIcon } from "lucide-react";
import { t } from "i18next";
import { useNavigate } from "react-router-dom";
@@ -23,7 +23,9 @@ export const MediaLoadingModal = () => {
const navigate = useNavigate();
const { whisperConfig } = useContext(AISettingsProviderContext);
const {
media,
decoded,
decodeError,
transcription,
transcribing,
transcribingProgress,
@@ -47,6 +49,21 @@ export const MediaLoadingModal = () => {
<CheckCircleIcon className="w-4 h-4 text-green-500" />
<span>{t("waveformIsDecoded")}</span>
</div>
) : decodeError ? (
<div className="mb-4 flex items-center space-x-4">
<div className="w-4 h-4">
<XCircleIcon className="w-4 h-4 text-destructive" />
</div>
<div className="select-text">
<div className="mb-2">
{decodeError}
</div>
<div className="text-sm text-muted-foreground">
{t("failedToDecodeWaveform")}:{" "}
<span className="break-all ">{media?.src}</span>
</div>
</div>
</div>
) : (
<div className="mb-4 flex items-center space-x-4">
<LoaderIcon className="w-4 h-4 animate-spin" />

View File

@@ -13,7 +13,9 @@ import {
} from "@vidstack/react/player/layouts/default";
export const MediaPlayer = () => {
const { media, setMediaProvider } = useContext(MediaPlayerProviderContext);
const { media, setMediaProvider, setDecodeError } = useContext(
MediaPlayerProviderContext
);
const mediaRemote = useMediaRemote();
if (!media?.src) return null;
@@ -31,6 +33,7 @@ export const MediaPlayer = () => {
setMediaProvider(provider.video);
}
}}
onError={(err) => setDecodeError(err.message)}
>
<MediaProvider />
<DefaultAudioLayout icons={defaultLayoutIcons} />

View File

@@ -14,6 +14,8 @@ import {
} from "@vidstack/react/player/layouts/default";
export const STORAGE_WORKER_ENDPOINT = "https://enjoy-storage.baizhiheizi.com";
import { TimelineEntry } from "echogarden/dist/utilities/Timeline.d.js";
import { t } from "i18next";
import { XCircleIcon } from "lucide-react";
export const PostAudio = (props: {
audio: Partial<MediumType>;
@@ -23,6 +25,7 @@ export const PostAudio = (props: {
const [currentTime, setCurrentTime] = useState<number>(0);
const { webApi } = useContext(AppSettingsProviderContext);
const [transcription, setTranscription] = useState<TranscriptionType>();
const [error, setError] = useState<string>(null);
const currentTranscription = transcription?.result["transcript"]
? (transcription.result?.timeline || []).find(
@@ -45,6 +48,22 @@ export const PostAudio = (props: {
});
}, [audio.md5]);
if (error) {
return (
<div className="w-full rounded-lg p-4 border">
<div className="flex items-center justify-center mb-2">
<XCircleIcon className="w-4 h-4 text-destructive" />
</div>
<div className="select-text break-all text-center text-sm text-muted-foreground mb-4">
{error}
</div>
<div className="flex items-center justify-center">
<Button onClick={() => setError(null)}>{t("retry")}</Button>
</div>
</div>
);
}
return (
<div className="w-full">
{audio.sourceUrl.startsWith(STORAGE_WORKER_ENDPOINT) ? (
@@ -53,6 +72,7 @@ export const PostAudio = (props: {
setCurrentTime={setCurrentTime}
audio={audio}
height={height}
onError={(err) => setError(err.message)}
/>
) : (
<MediaPlayer
@@ -60,6 +80,7 @@ export const PostAudio = (props: {
setCurrentTime(_currentTime);
}}
src={audio.sourceUrl}
onError={(err) => setError(err.message)}
>
<MediaProvider />
<DefaultAudioLayout icons={defaultLayoutIcons} />
@@ -88,8 +109,9 @@ const WavesurferPlayer = (props: {
height?: number;
currentTime: number;
setCurrentTime: (currentTime: number) => void;
onError?: (error: Error) => void;
}) => {
const { audio, height = 80, currentTime, setCurrentTime } = props;
const { audio, height = 80, onError, setCurrentTime } = props;
const [initialized, setInitialized] = useState(false);
const [isPlaying, setIsPlaying] = useState(false);
const [wavesurfer, setWavesurfer] = useState(null);
@@ -162,6 +184,9 @@ const WavesurferPlayer = (props: {
}, 1000);
setInitialized(true);
}),
wavesurfer.on("error", (err: Error) => {
onError(err);
}),
];
return () => {

View File

@@ -6,6 +6,8 @@ import { Button, Skeleton } from "@renderer/components/ui";
import { PlayIcon, PauseIcon } from "lucide-react";
import { useIntersectionObserver } from "@uidotdev/usehooks";
import { secondsToTimestamp } from "@renderer/lib/utils";
import { t } from "i18next";
import { XCircleIcon } from "lucide-react";
export const PostRecording = (props: {
recording: RecordingType;
@@ -20,6 +22,7 @@ export const PostRecording = (props: {
threshold: 1,
});
const [duration, setDuration] = useState<number>(0);
const [error, setError] = useState<string>(null);
const onPlayClick = useCallback(() => {
wavesurfer.isPlaying() ? wavesurfer.pause() : wavesurfer.play();
@@ -31,6 +34,7 @@ export const PostRecording = (props: {
if (!entry?.isIntersecting) return;
if (!recording.src) return;
if (wavesurfer) return;
if (error) return;
const ws = WaveSurfer.create({
container: containerRef.current,
@@ -48,7 +52,11 @@ export const PostRecording = (props: {
});
setWavesurfer(ws);
}, [recording.src, entry]);
return () => {
setWavesurfer(null);
};
}, [recording.src, entry, error]);
useEffect(() => {
if (!wavesurfer) return;
@@ -84,6 +92,9 @@ export const PostRecording = (props: {
}, 1000);
setInitialized(true);
}),
wavesurfer.on("error", (err: Error) => {
setError(err.message);
}),
];
return () => {
@@ -92,6 +103,22 @@ export const PostRecording = (props: {
};
}, [wavesurfer]);
if (error) {
return (
<div className="w-full bg-sky-500/30 rounded-lg p-4 border">
<div className="flex items-center justify-center mb-2">
<XCircleIcon className="w-4 h-4 text-destructive" />
</div>
<div className="select-text break-all text-center text-sm text-muted-foreground mb-4">
{error}
</div>
<div className="flex items-center justify-center">
<Button onClick={() => setError(null)}>{t("retry")}</Button>
</div>
</div>
);
}
return (
<div className="w-full">
<div className="flex justify-end">

View File

@@ -39,7 +39,6 @@ export const AppSettingsProvider = ({
}: {
children: React.ReactNode;
}) => {
const [initialized, setInitialized] = useState<boolean>(false);
const [version, setVersion] = useState<string>("");
const [apiUrl, setApiUrl] = useState<string>(WEB_API_URL);
const [webApi, setWebApi] = useState<Client>(null);
@@ -62,10 +61,6 @@ export const AppSettingsProvider = ({
fetchProxyConfig();
}, []);
useEffect(() => {
validate();
}, [user, libraryPath]);
useEffect(() => {
if (!apiUrl) return;
@@ -192,10 +187,6 @@ export const AppSettingsProvider = ({
});
};
const validate = async () => {
setInitialized(Boolean(user && libraryPath));
};
return (
<AppSettingsProviderContext.Provider
value={{
@@ -214,7 +205,7 @@ export const AppSettingsProvider = ({
ffmpegWasm,
proxy,
setProxy: setProxyConfigHandler,
initialized,
initialized: Boolean(user && libraryPath),
}}
>
{children}

View File

@@ -9,6 +9,7 @@ import Regions, {
import Chart from "chart.js/auto";
import { TimelineEntry } from "echogarden/dist/utilities/Timeline.d.js";
import { IPA_MAPPING } from "@/constants";
import { toast } from "@renderer/components/ui";
type MediaPlayerContextType = {
media: AudioType | VideoType;
@@ -19,6 +20,8 @@ type MediaPlayerContextType = {
wavesurfer: WaveSurfer;
setRef: (ref: any) => void;
decoded: boolean;
decodeError: string;
setDecodeError: (error: string) => void;
// player state
currentTime: number;
currentSegmentIndex: number;
@@ -89,6 +92,7 @@ export const MediaPlayerProvider = ({
// Player state
const [decoded, setDecoded] = useState<boolean>(false);
const [decodeError, setDecodeError] = useState<string>(null);
const [currentTime, setCurrentTime] = useState<number>(0);
const [currentSegmentIndex, setCurrentSegmentIndex] = useState<number>(0);
const [fitZoomRatio, setFitZoomRatio] = useState<number>(1.0);
@@ -333,6 +337,10 @@ export const MediaPlayerProvider = ({
wavesurfer.on("ready", () => {
setDecoded(true);
}),
wavesurfer.on("error", (err: Error) => {
toast.error(err.message);
setDecodeError(err.message);
}),
];
return () => {
@@ -360,7 +368,7 @@ export const MediaPlayerProvider = ({
return () => {
setFitZoomRatio(1.0);
}
};
}, [ref, wavesurfer, activeRegion]);
/*
@@ -411,6 +419,8 @@ export const MediaPlayerProvider = ({
*/
useEffect(() => {
initializeWavesurfer();
setDecoded(false);
setDecodeError(null);
}, [media, ref, mediaProvider]);
return (
@@ -422,6 +432,8 @@ export const MediaPlayerProvider = ({
wavesurfer,
setRef,
decoded,
decodeError,
setDecodeError,
currentTime,
currentSegmentIndex,
setCurrentSegmentIndex,

398
yarn.lock
View File

@@ -1144,7 +1144,7 @@ __metadata:
languageName: node
linkType: hard
"@babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.7, @babel/runtime@npm:^7.23.9":
"@babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.24.0":
version: 7.24.0
resolution: "@babel/runtime@npm:7.24.0"
dependencies:
@@ -2222,7 +2222,281 @@ __metadata:
languageName: node
linkType: hard
"@langchain/community@npm:^0.0.39, @langchain/community@npm:~0.0.36":
"@langchain/community@npm:^0.0.40":
version: 0.0.40
resolution: "@langchain/community@npm:0.0.40"
dependencies:
"@langchain/core": "npm:~0.1.44"
"@langchain/openai": "npm:~0.0.19"
flat: "npm:^5.0.2"
langsmith: "npm:~0.1.1"
uuid: "npm:^9.0.0"
zod: "npm:^3.22.3"
peerDependencies:
"@aws-crypto/sha256-js": ^5.0.0
"@aws-sdk/client-bedrock-agent-runtime": ^3.485.0
"@aws-sdk/client-bedrock-runtime": ^3.422.0
"@aws-sdk/client-dynamodb": ^3.310.0
"@aws-sdk/client-kendra": ^3.352.0
"@aws-sdk/client-lambda": ^3.310.0
"@aws-sdk/client-sagemaker-runtime": ^3.310.0
"@aws-sdk/client-sfn": ^3.310.0
"@aws-sdk/credential-provider-node": ^3.388.0
"@azure/search-documents": ^12.0.0
"@clickhouse/client": ^0.2.5
"@cloudflare/ai": "*"
"@datastax/astra-db-ts": ^0.1.4
"@elastic/elasticsearch": ^8.4.0
"@getmetal/metal-sdk": "*"
"@getzep/zep-js": ^0.9.0
"@gomomento/sdk": ^1.51.1
"@gomomento/sdk-core": ^1.51.1
"@google-ai/generativelanguage": ^0.2.1
"@gradientai/nodejs-sdk": ^1.2.0
"@huggingface/inference": ^2.6.4
"@mozilla/readability": "*"
"@opensearch-project/opensearch": "*"
"@pinecone-database/pinecone": "*"
"@planetscale/database": ^1.8.0
"@qdrant/js-client-rest": ^1.2.0
"@raycast/api": ^1.55.2
"@rockset/client": ^0.9.1
"@smithy/eventstream-codec": ^2.0.5
"@smithy/protocol-http": ^3.0.6
"@smithy/signature-v4": ^2.0.10
"@smithy/util-utf8": ^2.0.0
"@supabase/postgrest-js": ^1.1.1
"@supabase/supabase-js": ^2.10.0
"@tensorflow-models/universal-sentence-encoder": "*"
"@tensorflow/tfjs-converter": "*"
"@tensorflow/tfjs-core": "*"
"@upstash/redis": ^1.20.6
"@upstash/vector": ^1.0.2
"@vercel/kv": ^0.2.3
"@vercel/postgres": ^0.5.0
"@writerai/writer-sdk": ^0.40.2
"@xata.io/client": ^0.28.0
"@xenova/transformers": ^2.5.4
"@zilliz/milvus2-sdk-node": ">=2.2.7"
better-sqlite3: ^9.4.0
cassandra-driver: ^4.7.2
chromadb: "*"
closevector-common: 0.1.3
closevector-node: 0.1.6
closevector-web: 0.1.6
cohere-ai: "*"
convex: ^1.3.1
couchbase: ^4.3.0
discord.js: ^14.14.1
dria: ^0.0.3
faiss-node: ^0.5.1
firebase-admin: ^11.9.0 || ^12.0.0
google-auth-library: ^8.9.0
googleapis: ^126.0.1
hnswlib-node: ^1.4.2
html-to-text: ^9.0.5
ioredis: ^5.3.2
jsdom: "*"
jsonwebtoken: ^9.0.2
llmonitor: ^0.5.9
lodash: ^4.17.21
lunary: ^0.6.11
mongodb: ">=5.2.0"
mysql2: ^3.3.3
neo4j-driver: "*"
node-llama-cpp: "*"
pg: ^8.11.0
pg-copy-streams: ^6.0.5
pickleparser: ^0.2.1
portkey-ai: ^0.1.11
redis: "*"
replicate: ^0.18.0
typeorm: ^0.3.12
typesense: ^1.5.3
usearch: ^1.1.1
vectordb: ^0.1.4
voy-search: 0.6.2
weaviate-ts-client: "*"
web-auth-library: ^1.0.3
ws: ^8.14.2
peerDependenciesMeta:
"@aws-crypto/sha256-js":
optional: true
"@aws-sdk/client-bedrock-agent-runtime":
optional: true
"@aws-sdk/client-bedrock-runtime":
optional: true
"@aws-sdk/client-dynamodb":
optional: true
"@aws-sdk/client-kendra":
optional: true
"@aws-sdk/client-lambda":
optional: true
"@aws-sdk/client-sagemaker-runtime":
optional: true
"@aws-sdk/client-sfn":
optional: true
"@aws-sdk/credential-provider-node":
optional: true
"@azure/search-documents":
optional: true
"@clickhouse/client":
optional: true
"@cloudflare/ai":
optional: true
"@datastax/astra-db-ts":
optional: true
"@elastic/elasticsearch":
optional: true
"@getmetal/metal-sdk":
optional: true
"@getzep/zep-js":
optional: true
"@gomomento/sdk":
optional: true
"@gomomento/sdk-core":
optional: true
"@google-ai/generativelanguage":
optional: true
"@gradientai/nodejs-sdk":
optional: true
"@huggingface/inference":
optional: true
"@mozilla/readability":
optional: true
"@opensearch-project/opensearch":
optional: true
"@pinecone-database/pinecone":
optional: true
"@planetscale/database":
optional: true
"@qdrant/js-client-rest":
optional: true
"@raycast/api":
optional: true
"@rockset/client":
optional: true
"@smithy/eventstream-codec":
optional: true
"@smithy/protocol-http":
optional: true
"@smithy/signature-v4":
optional: true
"@smithy/util-utf8":
optional: true
"@supabase/postgrest-js":
optional: true
"@supabase/supabase-js":
optional: true
"@tensorflow-models/universal-sentence-encoder":
optional: true
"@tensorflow/tfjs-converter":
optional: true
"@tensorflow/tfjs-core":
optional: true
"@upstash/redis":
optional: true
"@upstash/vector":
optional: true
"@vercel/kv":
optional: true
"@vercel/postgres":
optional: true
"@writerai/writer-sdk":
optional: true
"@xata.io/client":
optional: true
"@xenova/transformers":
optional: true
"@zilliz/milvus2-sdk-node":
optional: true
better-sqlite3:
optional: true
cassandra-driver:
optional: true
chromadb:
optional: true
closevector-common:
optional: true
closevector-node:
optional: true
closevector-web:
optional: true
cohere-ai:
optional: true
convex:
optional: true
couchbase:
optional: true
discord.js:
optional: true
dria:
optional: true
faiss-node:
optional: true
firebase-admin:
optional: true
google-auth-library:
optional: true
googleapis:
optional: true
hnswlib-node:
optional: true
html-to-text:
optional: true
ioredis:
optional: true
jsdom:
optional: true
jsonwebtoken:
optional: true
llmonitor:
optional: true
lodash:
optional: true
lunary:
optional: true
mongodb:
optional: true
mysql2:
optional: true
neo4j-driver:
optional: true
node-llama-cpp:
optional: true
pg:
optional: true
pg-copy-streams:
optional: true
pickleparser:
optional: true
portkey-ai:
optional: true
redis:
optional: true
replicate:
optional: true
typeorm:
optional: true
typesense:
optional: true
usearch:
optional: true
vectordb:
optional: true
voy-search:
optional: true
weaviate-ts-client:
optional: true
web-auth-library:
optional: true
ws:
optional: true
checksum: 10c0/24c86d437bc14302c22ef2b0b55d6e3213487e69edf57c63be25888b2082391f76598263c8268e9e3ed73da0a6c1b1b9e7c1c474cf5fc2288bc1caf64e439732
languageName: node
linkType: hard
"@langchain/community@npm:~0.0.36":
version: 0.0.39
resolution: "@langchain/community@npm:0.0.39"
dependencies:
@@ -5374,12 +5648,12 @@ __metadata:
languageName: node
linkType: hard
"@types/node@npm:^20.11.27":
version: 20.11.27
resolution: "@types/node@npm:20.11.27"
"@types/node@npm:^20.11.28":
version: 20.11.28
resolution: "@types/node@npm:20.11.28"
dependencies:
undici-types: "npm:~5.26.4"
checksum: 10c0/ec40bea80c60a12b39bd0da9b16333237a84c67ae83c8aa382b88381ae3948943bf6af969442e209270ad3e109f301a6b01ab243f80bd0e69673a877425f9418
checksum: 10c0/c599745243ed9ae4ca87460f18f88d02ab7424b545136aa504ed7a1d898e3a9bb133c927bcc7e861f79d7f6043ef917a173e780c8a001e129221e92f6d97b0ee
languageName: node
linkType: hard
@@ -6453,14 +6727,14 @@ __metadata:
languageName: node
linkType: hard
"axios@npm:^1.6.7":
version: 1.6.7
resolution: "axios@npm:1.6.7"
"axios@npm:^1.6.8":
version: 1.6.8
resolution: "axios@npm:1.6.8"
dependencies:
follow-redirects: "npm:^1.15.4"
follow-redirects: "npm:^1.15.6"
form-data: "npm:^4.0.0"
proxy-from-env: "npm:^1.1.0"
checksum: 10c0/131bf8e62eee48ca4bd84e6101f211961bf6a21a33b95e5dfb3983d5a2fe50d9fffde0b57668d7ce6f65063d3dc10f2212cbcb554f75cfca99da1c73b210358d
checksum: 10c0/0f22da6f490335479a89878bc7d5a1419484fbb437b564a80c34888fc36759ae4f56ea28d55a191695e5ed327f0bad56e7ff60fb6770c14d1be6501505d47ab9
languageName: node
linkType: hard
@@ -8840,7 +9114,7 @@ __metadata:
"@ffmpeg/ffmpeg": "npm:^0.12.10"
"@ffmpeg/util": "npm:^0.12.1"
"@hookform/resolvers": "npm:^3.3.4"
"@langchain/community": "npm:^0.0.39"
"@langchain/community": "npm:^0.0.40"
"@langchain/google-genai": "npm:^0.0.10"
"@mozilla/readability": "npm:^0.5.0"
"@playwright/test": "npm:^1.42.1"
@@ -8875,7 +9149,7 @@ __metadata:
"@types/intl-tel-input": "npm:^18.1.4"
"@types/lodash": "npm:^4.17.0"
"@types/mark.js": "npm:^8.11.12"
"@types/node": "npm:^20.11.27"
"@types/node": "npm:^20.11.28"
"@types/react": "npm:^18.2.66"
"@types/react-dom": "npm:^18.2.22"
"@types/validator": "npm:^13.11.9"
@@ -8887,7 +9161,7 @@ __metadata:
"@vitejs/plugin-react": "npm:^4.2.1"
autoprefixer: "npm:^10.4.18"
autosize: "npm:^6.0.1"
axios: "npm:^1.6.7"
axios: "npm:^1.6.8"
camelcase: "npm:^8.0.0"
camelcase-keys: "npm:^9.1.3"
chart.js: "npm:^4.4.2"
@@ -8918,7 +9192,7 @@ __metadata:
html-to-text: "npm:^9.0.5"
https-proxy-agent: "npm:^7.0.4"
i18next: "npm:^23.10.1"
intl-tel-input: "npm:^19.5.7"
intl-tel-input: "npm:^20.0.3"
js-md5: "npm:^0.8.3"
langchain: "npm:^0.1.28"
lodash: "npm:^4.17.21"
@@ -8927,15 +9201,15 @@ __metadata:
microsoft-cognitiveservices-speech-sdk: "npm:^1.36.0"
next-themes: "npm:^0.3.0"
octokit: "npm:^3.1.2"
openai: "npm:^4.29.0"
openai: "npm:^4.29.1"
pitchfinder: "npm:^2.3.2"
postcss: "npm:^8.4.35"
postcss: "npm:^8.4.36"
progress: "npm:^2.0.3"
proxy-agent: "npm:^6.4.0"
react: "npm:^18.2.0"
react-activity-calendar: "npm:^2.2.8"
react-dom: "npm:^18.2.0"
react-hook-form: "npm:^7.51.0"
react-hook-form: "npm:^7.51.1"
react-hotkeys-hook: "npm:^4.5.0"
react-i18next: "npm:^14.1.0"
react-markdown: "npm:^9.0.1"
@@ -8947,7 +9221,7 @@ __metadata:
sequelize-typescript: "npm:^2.1.6"
sonner: "npm:^1.4.3"
sqlite3: "npm:^5.1.7"
tailwind-merge: "npm:^2.2.1"
tailwind-merge: "npm:^2.2.2"
tailwind-scrollbar: "npm:^3.1.0"
tailwind-scrollbar-hide: "npm:^1.1.7"
tailwindcss: "npm:^3.4.1"
@@ -9876,13 +10150,13 @@ __metadata:
languageName: node
linkType: hard
"follow-redirects@npm:^1.15.4":
version: 1.15.5
resolution: "follow-redirects@npm:1.15.5"
"follow-redirects@npm:^1.15.6":
version: 1.15.6
resolution: "follow-redirects@npm:1.15.6"
peerDependenciesMeta:
debug:
optional: true
checksum: 10c0/418d71688ceaf109dfd6f85f747a0c75de30afe43a294caa211def77f02ef19865b547dfb73fde82b751e1cc507c06c754120b848fe5a7400b0a669766df7615
checksum: 10c0/9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071
languageName: node
linkType: hard
@@ -11081,14 +11355,10 @@ __metadata:
languageName: node
linkType: hard
"intl-tel-input@npm:^19.5.7":
version: 19.5.7
resolution: "intl-tel-input@npm:19.5.7"
dependencies:
prop-types: "npm:^15.8.1"
react: "npm:^18.2.0"
react-dom: "npm:^18.2.0"
checksum: 10c0/99937f79099456759d1c6493c2b57d8a9e9ec4b8d186599be4ee432b4a8edd14fbb889f8866b6a7e001ef6a5092ee6fce81210592e10dfc061aa4f7bb9c07c33
"intl-tel-input@npm:^20.0.3":
version: 20.0.3
resolution: "intl-tel-input@npm:20.0.3"
checksum: 10c0/430315b65cc29becb3ea7cc2a99036ec3dae07d7c4ea1bbdea4823e798842c00bdc45e78bbebb8b555f6a369b5a99a5ca7f4ae64502082b9443aefbf5d897c5a
languageName: node
linkType: hard
@@ -12317,7 +12587,7 @@ __metadata:
languageName: node
linkType: hard
"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0":
"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0":
version: 1.4.0
resolution: "loose-envify@npm:1.4.0"
dependencies:
@@ -14100,7 +14370,7 @@ __metadata:
languageName: node
linkType: hard
"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1":
"object-assign@npm:^4.0.1":
version: 4.1.1
resolution: "object-assign@npm:4.1.1"
checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414
@@ -14256,9 +14526,9 @@ __metadata:
languageName: node
linkType: hard
"openai@npm:^4.29.0":
version: 4.29.0
resolution: "openai@npm:4.29.0"
"openai@npm:^4.29.1":
version: 4.29.1
resolution: "openai@npm:4.29.1"
dependencies:
"@types/node": "npm:^18.11.18"
"@types/node-fetch": "npm:^2.6.4"
@@ -14271,7 +14541,7 @@ __metadata:
web-streams-polyfill: "npm:^3.2.1"
bin:
openai: bin/cli
checksum: 10c0/df5a99c7a54f782780446cfb346d18793ded57a54908d839ca49967f85f8803c74ec7473f11426228af2c1df2c0d2325d52fe5590e54b194552593db7c524637
checksum: 10c0/7873d1c8f69d8a76ca38bd3b0aa10e967ee1a2e705a1a2eb1012dcdd1b689569e041e1bcbeb72e10fc15a43d62c0f99e01de58c8ed454e8c0b54626b58c0794f
languageName: node
linkType: hard
@@ -14918,6 +15188,17 @@ __metadata:
languageName: node
linkType: hard
"postcss@npm:^8.4.36":
version: 8.4.36
resolution: "postcss@npm:8.4.36"
dependencies:
nanoid: "npm:^3.3.7"
picocolors: "npm:^1.0.0"
source-map-js: "npm:^1.1.0"
checksum: 10c0/e7c834e31d8f4e8dfd0a427df36fdc7bdc58a16e373551618e2c3ac172019eb816b24f1b4709311ebcade8d3ba31b2d75522d28ef45ecbbeb11eb01f265579fb
languageName: node
linkType: hard
"postject@npm:^1.0.0-alpha.6":
version: 1.0.0-alpha.6
resolution: "postject@npm:1.0.0-alpha.6"
@@ -14996,17 +15277,6 @@ __metadata:
languageName: node
linkType: hard
"prop-types@npm:^15.8.1":
version: 15.8.1
resolution: "prop-types@npm:15.8.1"
dependencies:
loose-envify: "npm:^1.4.0"
object-assign: "npm:^4.1.1"
react-is: "npm:^16.13.1"
checksum: 10c0/59ece7ca2fb9838031d73a48d4becb9a7cc1ed10e610517c7d8f19a1e02fa47f7c27d557d8a5702bec3cfeccddc853579832b43f449e54635803f277b1c78077
languageName: node
linkType: hard
"property-information@npm:^6.0.0":
version: 6.4.1
resolution: "property-information@npm:6.4.1"
@@ -15206,12 +15476,12 @@ __metadata:
languageName: node
linkType: hard
"react-hook-form@npm:^7.51.0":
version: 7.51.0
resolution: "react-hook-form@npm:7.51.0"
"react-hook-form@npm:^7.51.1":
version: 7.51.1
resolution: "react-hook-form@npm:7.51.1"
peerDependencies:
react: ^16.8.0 || ^17 || ^18
checksum: 10c0/929464db00d1bc60bb7de41ab7c05cd2b28afba1d4d4ed10b02288919fb95fa81667e467bc571cbb403bec2bb9116b465211ce9962c3c0120a49dcbf47bfa699
checksum: 10c0/f0acbf27fc548d3cd0e4db40b84d9dfe6c24209e4421fffbd422da15e32cc98f877ab0af9e06cb1deaf4205ec655b56020ff9f8b2bae6ada5e619890f174c374
languageName: node
linkType: hard
@@ -15243,13 +15513,6 @@ __metadata:
languageName: node
linkType: hard
"react-is@npm:^16.13.1":
version: 16.13.1
resolution: "react-is@npm:16.13.1"
checksum: 10c0/33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1
languageName: node
linkType: hard
"react-markdown@npm:^9.0.1":
version: 9.0.1
resolution: "react-markdown@npm:9.0.1"
@@ -16316,6 +16579,13 @@ __metadata:
languageName: node
linkType: hard
"source-map-js@npm:^1.1.0":
version: 1.1.0
resolution: "source-map-js@npm:1.1.0"
checksum: 10c0/d1f016efe4fcf67fd92e36da0670f2889b13a36cc453329758336450e811c61164376eb451b453b4dd4e89a760f841b0a014942d54f240af31a791829bc0e336
languageName: node
linkType: hard
"source-map-support@npm:^0.5.13":
version: 0.5.21
resolution: "source-map-support@npm:0.5.21"
@@ -16761,12 +17031,12 @@ __metadata:
languageName: node
linkType: hard
"tailwind-merge@npm:^2.2.1":
version: 2.2.1
resolution: "tailwind-merge@npm:2.2.1"
"tailwind-merge@npm:^2.2.2":
version: 2.2.2
resolution: "tailwind-merge@npm:2.2.2"
dependencies:
"@babel/runtime": "npm:^7.23.7"
checksum: 10c0/14ab965ec897e9377484b7593f7a700dde09b8035b762ad42652622a3ed1f202b203f48c0f235c0b1b38e9390470d94458f6f9010d33a5a18d71b15f38b986a6
"@babel/runtime": "npm:^7.24.0"
checksum: 10c0/68a5e199848a467aed4f8d1a8d7b6a5b583ff72f1d2801e018bf245eaa41e6564b63ead9e2b708a214cefbd843970c5e0a21754d5f2a20e2c1238e25955685ce
languageName: node
linkType: hard