diff --git a/.github/workflows/build-enjoy-app.yml b/.github/workflows/build-enjoy-app.yml new file mode 100644 index 000000000..30d55957d --- /dev/null +++ b/.github/workflows/build-enjoy-app.yml @@ -0,0 +1,63 @@ +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 }} + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Get current time + uses: josStorer/get-current-time@v2 + id: current-time + with: + format: YYYYMMDDHHmm + + - uses: actions/cache@v4 + 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') }} + + - name: Install dependencies + run: yarn install + + - name: Install Apple certificate + if: contains(github.event.inputs.os, 'macos') + env: + MACOS_CERTIFICATE_APPLICATION_BASE64: ${{ secrets.MACOS_CERTIFICATE_APPLICATION_BASE64 }} + MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }} + run: ./enjoy/scripts/add-macos-cert.sh + + - name: Make + env: + GITHUB_TOKEN: ${{ secrets.PUBLISH_TOKEN }} + APPLE_ID: ${{ runner.os == 'macOS' && secrets.APPLE_ID || '' }} + APPLE_APP_PASSWORD: ${{ runner.os == 'macOS' && secrets.APPLE_APP_PASSWORD || '' }} + APPLE_TEAM_ID: ${{ runner.os == 'macOS' && secrets.APPLE_TEAM_ID || '' }} + run: yarn run enjoy:make + + - 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 }} + path: | + enjoy/out/make/**/*.deb + enjoy/out/make/**/*.rpm + enjoy/out/make/**/*.zip + enjoy/out/make/**/*.exe + enjoy/out/make/**/*.dmg diff --git a/.github/workflows/deploy-enjoy-docs.yml b/.github/workflows/deploy-enjoy-docs.yml new file mode 100644 index 000000000..db5df173c --- /dev/null +++ b/.github/workflows/deploy-enjoy-docs.yml @@ -0,0 +1,46 @@ +name: Deploy Enjoy Docs website + +on: + push: + branches: + - main + paths: + - "enjoy-docs/**" + pull_request: + branches: + - main + paths: + - "enjoy-docs/**" + +jobs: + deploy: + runs-on: ubuntu-latest + name: Deploy + steps: + # checkout the code + - uses: actions/checkout@v4 + + - uses: actions/cache@v4 + with: + path: "**/node_modules" + key: ${{ runner.os }}-${{ hashFiles('**/yarn.lock') }} + + - name: Setup node env + uses: actions/setup-node@master + with: + node-version: "20" + + - name: Install Independents + run: yarn install + + - name: Build + run: yarn docs:build + + - name: Deploy + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: pages deploy .vitepress/dist --project-name=enjoy-docs + workingDirectory: "enjoy-docs" + diff --git a/.github/workflows/release-enjoy-app.yml b/.github/workflows/release-enjoy-app.yml index 87720d50f..b74e33064 100644 --- a/.github/workflows/release-enjoy-app.yml +++ b/.github/workflows/release-enjoy-app.yml @@ -6,20 +6,39 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [macos-latest, windows-latest, ubuntu-latest] + os: [macos-12, macos-14, windows-latest, ubuntu-latest] steps: - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 20 - - name: install dependencies + + - name: Install dependencies run: yarn install - - name: publish + + - name: Install Apple certificate + if: contains(github.event.inputs.os, 'macos') env: - GITHUB_TOKEN: ${{ secrets.PUBLISH_TOKEN }} - run: yarn publish:enjoy - - if: matrix.os == 'macos-latest' + MACOS_CERTIFICATE_APPLICATION_BASE64: ${{ secrets.MACOS_CERTIFICATE_APPLICATION_BASE64 }} + MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }} + run: ./enjoy/scripts/add-macos-cert.sh + + - name: Publish env: GITHUB_TOKEN: ${{ secrets.PUBLISH_TOKEN }} - PACKAGE_OS_ARCH: arm64 - run: yarn run publish:enjoy --arch=arm64 + APPLE_ID: ${{ runner.os == 'macOS' && secrets.APPLE_ID || '' }} + APPLE_APP_PASSWORD: ${{ runner.os == 'macOS' && secrets.APPLE_APP_PASSWORD || '' }} + APPLE_TEAM_ID: ${{ runner.os == 'macOS' && secrets.APPLE_TEAM_ID || '' }} + run: yarn enjoy:publish + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: Enjoy-${{ runner.os }}-${{ matrix.os == 'macos-14' && 'arm64' || 'x64' }}-build-${{ github.ref_name }} + path: | + enjoy/out/make/**/*.deb + enjoy/out/make/**/*.rpm + enjoy/out/make/**/*.zip + enjoy/out/make/**/*.exe + enjoy/out/make/**/*.dmg diff --git a/.github/workflows/test-enjoy-app.yml b/.github/workflows/test-enjoy-app.yml index 8c03c8582..315b7bde9 100644 --- a/.github/workflows/test-enjoy-app.yml +++ b/.github/workflows/test-enjoy-app.yml @@ -10,43 +10,47 @@ on: - "enjoy/**/*.js" - "enjoy/**/*.mjs" jobs: - e2e: + e2e-test: timeout-minutes: 60 runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - os: - [ - macos-latest, - macos-13, - macos-14, - windows-2019, - windows-latest, - ubuntu-latest, - ] + os: [macos-12, macos-14, windows-latest, ubuntu-latest] steps: - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 20 + + - uses: actions/cache@v4 + 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') }} + - name: Install dependencies - run: npm install -g yarn && yarn - - if: matrix.os == 'macos-latest' - name: Install sdl2 for macos + run: yarn install + + - name: Install sdl2 for macOS12 + if: matrix.os == 'macos-12' run: | brew update brew install sdl2 - - if: startsWith(matrix.os, 'ubuntu') - name: Run tests with xvfb-run on ubuntu + + - name: Run tests with xvfb-run on Ubuntu + if: contains(matrix.os, 'ubuntu') run: | xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- yarn test:enjoy - - if: startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'windows') - name: Run tests - run: yarn test:enjoy + + - name: Run tests on macOS or Windows + if: contains(matrix.os, 'macos') || contains(matrix.os, 'windows') + run: yarn enjoy:test + - uses: actions/upload-artifact@v4 if: always() with: - name: playwright-report - path: playwright-report/ + name: ${{matrix.os}}-playwright-report + path: enjoy/playwright-report/ retention-days: 30 diff --git a/1000-hours/.vitepress/config.mts b/1000-hours/.vitepress/config.mts index 073184572..1629e4392 100644 --- a/1000-hours/.vitepress/config.mts +++ b/1000-hours/.vitepress/config.mts @@ -35,9 +35,9 @@ export default withMermaid( // provider: 'local' provider: 'algolia', options: { - appId: 'QF5TVZ8TIO', - apiKey: '8dac3a5e27daaaf57efc72604ca08b98', - indexName: '1000h_prod' + appId: 'KKK8CORNSR', + apiKey: 'd613ff31a535ff1e9535cf9c88ec420a', + indexName: '1000h' } }, diff --git a/1000-hours/intro.md b/1000-hours/intro.md index 48d39e4c4..79ce9e4f6 100644 --- a/1000-hours/intro.md +++ b/1000-hours/intro.md @@ -32,7 +32,7 @@ 这场训练虽然以**英语**为示范训练标的,但,在其过程中,你的**母语**水平只能会水涨船高。虽然,你的第二语言水平**必然**受到第一语言的**限制**。但是,反过来,在你通过努力把原本的第二语言练成第一语言的过程中,你原本的第一语言只能比原来更强。新的语言会**反哺**之前已经掌握的语言。 -这场训练会直接改变你的**大脑结构**。完成这场训练的过程中,你的大脑内部,**灰质密度**会变得越来越高,**灰质体积**会变得越来越大,**白质覆盖面积**也会越来越广。如果用 fMRI(核磁共振成像)设备扫描,那么,这一切对你来说都应该是肉眼可见的变化。 +这场训练会直接改变你的**大脑结构**。完成这场训练的过程中,你的大脑内部,**灰质密度**会变得越来越高,**灰质体积**会变得越来越大,**白质覆盖面积**也会越来越广。如果用 fMRI(功能性磁共振成像)设备扫描,那么,这一切对你来说都应该是肉眼可见的变化。 如此这般的大脑结构变化,对一个人产生的影响,绝不仅仅是多掌握了一门外语或者提高了自然语言使用能力那么简单,它带来的变化非常普遍且又深远。 diff --git a/1000-hours/public/audios/academically-uk.mp3 b/1000-hours/public/audios/academically-uk.mp3 new file mode 100644 index 000000000..87b598cfe Binary files /dev/null and b/1000-hours/public/audios/academically-uk.mp3 differ diff --git a/1000-hours/public/audios/academically-us.mp3 b/1000-hours/public/audios/academically-us.mp3 new file mode 100644 index 000000000..fd8565ca8 Binary files /dev/null and b/1000-hours/public/audios/academically-us.mp3 differ diff --git a/1000-hours/public/audios/awful-uk.mp3 b/1000-hours/public/audios/awful-uk.mp3 new file mode 100644 index 000000000..ce9f5af67 Binary files /dev/null and b/1000-hours/public/audios/awful-uk.mp3 differ diff --git a/1000-hours/public/audios/awful-us.mp3 b/1000-hours/public/audios/awful-us.mp3 new file mode 100644 index 000000000..4581e20ce Binary files /dev/null and b/1000-hours/public/audios/awful-us.mp3 differ diff --git a/1000-hours/public/audios/didn't-uk.mp3 b/1000-hours/public/audios/didn't-uk.mp3 new file mode 100644 index 000000000..a9dfa289b Binary files /dev/null and b/1000-hours/public/audios/didn't-uk.mp3 differ diff --git a/1000-hours/public/audios/didn't-us.mp3 b/1000-hours/public/audios/didn't-us.mp3 new file mode 100644 index 000000000..3274be41c Binary files /dev/null and b/1000-hours/public/audios/didn't-us.mp3 differ diff --git a/1000-hours/public/audios/fear-uk.mp3 b/1000-hours/public/audios/fear-uk.mp3 new file mode 100644 index 000000000..e0185537a Binary files /dev/null and b/1000-hours/public/audios/fear-uk.mp3 differ diff --git a/1000-hours/public/audios/fear-us.mp3 b/1000-hours/public/audios/fear-us.mp3 new file mode 100644 index 000000000..21f347c31 Binary files /dev/null and b/1000-hours/public/audios/fear-us.mp3 differ diff --git a/1000-hours/public/audios/fill-uk.mp3 b/1000-hours/public/audios/fill-uk.mp3 new file mode 100644 index 000000000..ea7b46e24 Binary files /dev/null and b/1000-hours/public/audios/fill-uk.mp3 differ diff --git a/1000-hours/public/audios/fill-us.mp3 b/1000-hours/public/audios/fill-us.mp3 new file mode 100644 index 000000000..fc998ad22 Binary files /dev/null and b/1000-hours/public/audios/fill-us.mp3 differ diff --git a/1000-hours/public/audios/it-was-your-job-uk.mp3 b/1000-hours/public/audios/it-was-your-job-uk.mp3 new file mode 100644 index 000000000..99ced3ee2 Binary files /dev/null and b/1000-hours/public/audios/it-was-your-job-uk.mp3 differ diff --git a/1000-hours/public/audios/it-was-your-job-us.mp3 b/1000-hours/public/audios/it-was-your-job-us.mp3 new file mode 100644 index 000000000..e800a60f5 Binary files /dev/null and b/1000-hours/public/audios/it-was-your-job-us.mp3 differ diff --git a/1000-hours/public/audios/little-uk.mp3 b/1000-hours/public/audios/little-uk.mp3 new file mode 100644 index 000000000..6d599d2f6 Binary files /dev/null and b/1000-hours/public/audios/little-uk.mp3 differ diff --git a/1000-hours/public/audios/little-us.mp3 b/1000-hours/public/audios/little-us.mp3 new file mode 100644 index 000000000..c1606341a Binary files /dev/null and b/1000-hours/public/audios/little-us.mp3 differ diff --git a/1000-hours/public/audios/miss-you-so-much-uk.mp3 b/1000-hours/public/audios/miss-you-so-much-uk.mp3 new file mode 100644 index 000000000..1eadf6476 Binary files /dev/null and b/1000-hours/public/audios/miss-you-so-much-uk.mp3 differ diff --git a/1000-hours/public/audios/miss-you-so-much-us.mp3 b/1000-hours/public/audios/miss-you-so-much-us.mp3 new file mode 100644 index 000000000..deb3a8981 Binary files /dev/null and b/1000-hours/public/audios/miss-you-so-much-us.mp3 differ diff --git a/1000-hours/public/audios/rhythm-uk.mp3 b/1000-hours/public/audios/rhythm-uk.mp3 new file mode 100644 index 000000000..9fe047b4a Binary files /dev/null and b/1000-hours/public/audios/rhythm-uk.mp3 differ diff --git a/1000-hours/public/audios/rhythm-us.mp3 b/1000-hours/public/audios/rhythm-us.mp3 new file mode 100644 index 000000000..f042cc68e Binary files /dev/null and b/1000-hours/public/audios/rhythm-us.mp3 differ diff --git a/1000-hours/public/audios/seal-uk.mp3 b/1000-hours/public/audios/seal-uk.mp3 new file mode 100644 index 000000000..59e917660 Binary files /dev/null and b/1000-hours/public/audios/seal-uk.mp3 differ diff --git a/1000-hours/public/audios/seal-us.mp3 b/1000-hours/public/audios/seal-us.mp3 new file mode 100644 index 000000000..3b3e9b366 Binary files /dev/null and b/1000-hours/public/audios/seal-us.mp3 differ diff --git a/1000-hours/public/audios/shall-uk.mp3 b/1000-hours/public/audios/shall-uk.mp3 new file mode 100644 index 000000000..4888aae48 Binary files /dev/null and b/1000-hours/public/audios/shall-uk.mp3 differ diff --git a/1000-hours/public/audios/shall-us.mp3 b/1000-hours/public/audios/shall-us.mp3 new file mode 100644 index 000000000..6e426a429 Binary files /dev/null and b/1000-hours/public/audios/shall-us.mp3 differ diff --git a/1000-hours/public/audios/tale-uk.mp3 b/1000-hours/public/audios/tale-uk.mp3 new file mode 100644 index 000000000..2a0b5f6a5 Binary files /dev/null and b/1000-hours/public/audios/tale-uk.mp3 differ diff --git a/1000-hours/public/audios/tale-us.mp3 b/1000-hours/public/audios/tale-us.mp3 new file mode 100644 index 000000000..8e56ac294 Binary files /dev/null and b/1000-hours/public/audios/tale-us.mp3 differ diff --git a/1000-hours/public/audios/time-uk.mp3 b/1000-hours/public/audios/time-uk.mp3 new file mode 100644 index 000000000..26ce7bd7c Binary files /dev/null and b/1000-hours/public/audios/time-uk.mp3 differ diff --git a/1000-hours/public/audios/time-us.mp3 b/1000-hours/public/audios/time-us.mp3 new file mode 100644 index 000000000..97b2d96cf Binary files /dev/null and b/1000-hours/public/audios/time-us.mp3 differ diff --git a/1000-hours/public/audios/wear-uk.mp3 b/1000-hours/public/audios/wear-uk.mp3 new file mode 100644 index 000000000..05250df2e Binary files /dev/null and b/1000-hours/public/audios/wear-uk.mp3 differ diff --git a/1000-hours/public/audios/wear-us.mp3 b/1000-hours/public/audios/wear-us.mp3 new file mode 100644 index 000000000..549142e81 Binary files /dev/null and b/1000-hours/public/audios/wear-us.mp3 differ diff --git a/1000-hours/public/audios/well-uk.mp3 b/1000-hours/public/audios/well-uk.mp3 new file mode 100644 index 000000000..458d56139 Binary files /dev/null and b/1000-hours/public/audios/well-uk.mp3 differ diff --git a/1000-hours/public/audios/well-us.mp3 b/1000-hours/public/audios/well-us.mp3 new file mode 100644 index 000000000..ec7f98c2c Binary files /dev/null and b/1000-hours/public/audios/well-us.mp3 differ diff --git a/1000-hours/public/audios/wouldn't-uk.mp3 b/1000-hours/public/audios/wouldn't-uk.mp3 new file mode 100644 index 000000000..feeb2deb8 Binary files /dev/null and b/1000-hours/public/audios/wouldn't-uk.mp3 differ diff --git a/1000-hours/public/audios/wouldn't-us.mp3 b/1000-hours/public/audios/wouldn't-us.mp3 new file mode 100644 index 000000000..c428ca848 Binary files /dev/null and b/1000-hours/public/audios/wouldn't-us.mp3 differ diff --git a/1000-hours/public/jupyter-notebooks/edge-tts-valcab-pronounciation.ipynb b/1000-hours/public/jupyter-notebooks/edge-tts-valcab-pronounciation.ipynb index 34474a27d..7c857fe52 100644 --- a/1000-hours/public/jupyter-notebooks/edge-tts-valcab-pronounciation.ipynb +++ b/1000-hours/public/jupyter-notebooks/edge-tts-valcab-pronounciation.ipynb @@ -31,7 +31,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 4, "id": "9aad6634-e833-4ec4-b285-84e051329712", "metadata": {}, "outputs": [ @@ -39,8 +39,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "pygame 2.5.2 (SDL 2.28.3, Python 3.11.5)\n", - "Hello from the pygame community. https://www.pygame.org/contribute.html\n", "Files created!\n" ] } @@ -51,7 +49,7 @@ "import pygame\n", "\n", "TEXT = \"\"\"\n", - "plaid\n", + "time\n", "\"\"\"\n", "\n", "Wordlist = TEXT.split(\",\")\n", diff --git a/1000-hours/sounds-of-english/01-1-vowels.md b/1000-hours/sounds-of-english/01-1-vowels.md index 9b6e8a21c..2fdd59cd3 100644 --- a/1000-hours/sounds-of-english/01-1-vowels.md +++ b/1000-hours/sounds-of-english/01-1-vowels.md @@ -28,8 +28,14 @@ ::: +::: tip + +在 D.J. 的某些版本里, `əʊ`,也被写作`oʊ` —— 所以现在也有一些词典用的是 `oʊ`。我的个人看法是,写作 `əʊ` 相对更合理,因为 `o` 并没有在 6 个基础音素里出现过。 + +::: + ::: info 有时你会看到三种颜色的小喇叭图标,暗红色、浅蓝色,或者黑色,用鼠标点击它可以听音频播放。比如,*happy* `/ˈhæpi/` —— 暗红色喇叭是英式发音;浅蓝色是美式发音;黑色是其他口音。 -::: +::: \ No newline at end of file diff --git a/1000-hours/sounds-of-english/01-3-us-phonemes.md b/1000-hours/sounds-of-english/01-3-us-phonemes.md index 6692491db..313402180 100644 --- a/1000-hours/sounds-of-english/01-3-us-phonemes.md +++ b/1000-hours/sounds-of-english/01-3-us-phonemes.md @@ -4,7 +4,7 @@ 关于美式发音的音标标注,可以大致总结为以下几点: -> * 短元音 `ʌ` 变得与 `ə` 非常接近,甚至常常直接被 `ə` 替代。比如,but `/bʌt/` 直接被标注为 `/bət/`。 +> * 短元音 `ʌ` 变得与 `ə` 非常接近,甚至常常直接被 `ə` 替代。比如,*but* `/bʌt/` 直接被标注为 `/bət/`。 > * 长短元音不统一使用 `ː` 区分,而是`ə/ɑ`、`ə/ɜ`、`ɚ/ɝ`、 `e/æ`、`ɪ/i`、`ʊ/u`、`ɒ/ɔ`。 > * 短元音 `e` 有时用 `ɛ` 标注。 > * 短元音 `ə` ,由于经常附带着 `ʳ` 音,常常被标注为 `ɚ`;不带有 `ʳ` 音的时候,被标注为 `ɜ`。 diff --git "a/1000-hours/sounds-of-english/10-\311\224.md" "b/1000-hours/sounds-of-english/10-\311\224.md" index 549b7582f..ca924396c 100644 --- "a/1000-hours/sounds-of-english/10-\311\224.md" +++ "b/1000-hours/sounds-of-english/10-\311\224.md" @@ -2,4 +2,6 @@ 这一对元音在发声的时候,嘴唇动作非常明显,嘴唇得形成一个小的圆形之后开始发音。另外,`ɔː` 可能会被美国人读成 `ɔʳ` ,更像是双元音 `ɔəʳ` —— 但,再一次,还是不一定都如此,需要逐个核对。 -另外,D.J. 音标最初的时候短元音用 `ɔ`,长元音用 `ɔː`;但后来短元音 `ɔ` 开始使用笔划上闭口的 `ɒ`,长元音依然使用带着长音符号且笔划上开口的 `ɔː`。 \ No newline at end of file +::: info +D.J. 音标最初的时候短元音用 `ɔ`,长元音用 `ɔː`;但后来短元音 `ɔ` 开始使用笔划上闭口的 `ɒ`,长元音依然使用带着长音符号且笔划上开口的 `ɔː`。 +::: \ No newline at end of file diff --git "a/1000-hours/sounds-of-english/11-a\311\252.md" "b/1000-hours/sounds-of-english/11-a\311\252.md" index 04989dd88..ce20e5daa 100644 --- "a/1000-hours/sounds-of-english/11-a\311\252.md" +++ "b/1000-hours/sounds-of-english/11-a\311\252.md" @@ -10,10 +10,4 @@ 亚洲人常常会把所有双元音都读成单元音的长度。不仅如此,他们也常常会不由自主地把很多长元音也读成相应更短的版本。这是因为在亚洲语系往往以字(而不是词)为最小单位,而后,每个字都是单音节,每个音节里的元音(比如,中文中的 “韵母”)都是等长的。 -另外,有 3 个双元音里有 `ʊ` 这个音,`aʊ, əʊ, ʊə` —— 若是不配合着嘴唇的动作,就读不准它们。而剩下的 5 个双元音,`aɪ, eɪ, ɔɪ, eə, ɪə` 都是在嘴唇几乎不动的情况下完成的,全靠喉咙部位的动作。 - -::: tip - -在 D.J. 的某些版本里, `əʊ`,也被写作`oʊ` —— 所以现在也有一些词典用的是 `oʊ`。我的个人看法是,写作 `əʊ` 相对更合理,因为 `o` 并没有在 6 个基础音素里出现过。 - -::: \ No newline at end of file +另外,有 3 个双元音里有 `ʊ` 这个音,`aʊ, əʊ, ʊə` —— 若是不配合着嘴唇的动作,就读不准它们。而剩下的 5 个双元音,`aɪ, eɪ, ɔɪ, eə, ɪə` 都是在嘴唇几乎不动的情况下完成的,全靠喉咙部位的动作。 \ No newline at end of file diff --git a/1000-hours/sounds-of-english/13-pbmnfkgh.md b/1000-hours/sounds-of-english/13-pbmnfkgh.md index 74011496e..2fda8ef3a 100644 --- a/1000-hours/sounds-of-english/13-pbmnfkgh.md +++ b/1000-hours/sounds-of-english/13-pbmnfkgh.md @@ -6,4 +6,14 @@ 于是,老的习惯一不小心就会冲进新学的语言,总是不由自主地在这些音后面加上一个 `ə`…… 比如,很多人总是把 *please* 读得听起来像是 *police* 的第一个音节…… -如果发现自己总是不小心在这些辅音后加上不应该有的 `ə` 的话,不妨新学一个英文中没有的元音 `ɤ` —— 用这个 `ɤ` 音替代那个不应该有的 `ə`,效果也还不错。 \ No newline at end of file +如果发现自己总是不小心在这些辅音后加上不应该有的 `ə` 的话,不妨新学一个英文中没有的元音 `ɤ` —— 用这个 `ɤ` 音替代那个不应该有的 `ə`,效果也还不错。 + +::: tip +关于 `ɤ`,你可以尝试一下用 *academically* 这个 6 个音节的词汇仔细体会一下。 + +词典里,它的音标标注一般是:`/ˌækəˈdemɪk(ə)li/`—— `k` 后面的 `ə` 带着括号的意思是说,它 “可有可无” —— 所以,你可以把它读成 `/ˌækəˈdemɪkli/` 或者 `/ˌækəˈdemɪkəli/`。未经矫正的带有明显中国口音的人,可能会把 `ə` 误读成 `əu`,也就是 `/ˌækəˈdemɪkəuli/`…… 不过, + +无论哪种情况,如果你把 `ə` 直接改成很轻的 `ɤ` —— `/ˌækəˈdemɪkɤli/` —— 听起来就是全无口音的状态。甚至,你还可以试试 `/ˌækɤˈdemɪkɤli/`,也就是说,把两个 `ə` 都变成 `ɤ`,再感觉一下。 +::: + +`ɤ` 和 `ə` 的重点差别在于,`ɤ` 发声时,口腔内气流共鸣位置很靠前,且相当轻微;`ə` 发声时,口腔内气流共鸣位置靠后,相对声音略大且更为清楚。 \ No newline at end of file diff --git a/1000-hours/sounds-of-english/15-mn.md b/1000-hours/sounds-of-english/15-mn.md index 95b586ca6..e97ada0ef 100644 --- a/1000-hours/sounds-of-english/15-mn.md +++ b/1000-hours/sounds-of-english/15-mn.md @@ -17,3 +17,8 @@ > * *wrong idea* ⭢ `/rɔn aɪˈdiə/` > * *thinking of* ⭢ `/ˈθɪŋkɪn əv/` +另外,`m`、`n` 常常会使之前的辅音,尤其是 `d`、`t` 变成**音节辅音**(*syllabic consonant*),比如,*didn't* `/ˈdɪd̩nt/`, *wouldn't* `/ˈwʊd̩nt/` —— 独自构成音节的那个辅音,例如这里的 `d`,下面多了个竖线作为标注,`d̩`。再比如,*rhythm* `/ˈrɪð̩m/`。 + +有些词典会直接将 *didn't* 标注为 `/ˈdɪdənt/`,将 *wouldn't* 标注为 `/ˈwʊdənt/`,将 *rhythm* 标注成 `/ˈrɪðəm/`…… 但是,音节辅音内的元音音素,更准确地讲,更接近 `ɤ`([2.2.1](13-pbmnfkgh))而不是 `ə` —— 这个细微差异,竟然会使美国人轻易地听出外国口音[^1]。 + +[^1]: *Manual of Amewrican English Pronuciation*, 4th edition, by Clifford H. Prator, Jr. Betty Wallace Robinett. Page 118. \ No newline at end of file diff --git a/1000-hours/sounds-of-english/16-tdsz.md b/1000-hours/sounds-of-english/16-tdsz.md index 00de05534..fd50d3659 100644 --- a/1000-hours/sounds-of-english/16-tdsz.md +++ b/1000-hours/sounds-of-english/16-tdsz.md @@ -12,4 +12,6 @@ 而 `t, d, s, z` 这四个辅音发声时起始的**舌尖位置**,同样影响基于它们的另外三个辅音,`ʃ, tʃ, dʒ`…… 比较有趣的是,中文的普通话里恰好有对应的**卷舌音**,`sh, ch, zh`。找对发这三个声母发声时起始的舌尖位置,从那里开始读英文的 `t, d, s, z` 就对了。只不过,有一点点的区别,中文的 `sh, zh` 舌尖顶着上颚,同样的方式读出来的是英文的 `ʃ, dʒ`。而英文的 `s, z` 离上颚还有一点距离,但,不像中文的 `s, z` 那样靠近牙齿。 -对中文普通话使用者来说,必须为这几个辅音学习新的发声方式。可以用 *students* `/ˈstudənts/` 这个词作为起步反复练习。以后随时注意这些辅音发声时起始的 “舌尖位置”。 \ No newline at end of file +另外,美国人在说 `t` 这个辅音的时候,经常会把它读成**送气音**(*asperated*),即,发着 `h` 的音读出,比如 *time* `/tʰaɪm/`。 + +对中文普通话使用者来说,必须为这几个辅音学习新的发声方式。可以用 *students* `/ˈstudənts/` 这个词作为起步反复练习。以后随时注意这些辅音发声时起始的**舌尖位置**。 \ No newline at end of file diff --git a/1000-hours/sounds-of-english/17-td.md b/1000-hours/sounds-of-english/17-td.md index 4e55acd1c..b846cf9e9 100644 --- a/1000-hours/sounds-of-english/17-td.md +++ b/1000-hours/sounds-of-english/17-td.md @@ -20,6 +20,8 @@ `t` 为末尾的单词,遇到 `ju` 开头的单词,连起来读的时候,`t` 往往会变成 `tʃ`;而 `d` 遇到 `ju` 的话,`d` 会变成 `dʒ`。这种现象被称为**同化**(*assimilation*)。最常见的比如,*Don't you?* `/dəʊn tʃju?/`;以及,*Would you?* `/wʊ dʒju?/` 这里的关键在于,`t, d` 发声时起始的舌尖位置如果放对了([2.2.4](16-tdsz)),它与后面的 `/ju/` 连起来的发声就只能如此。 +同化主要发生在 `j` 这个音上。除了已经讲过的 `j` 前面遇到 `t` 和 `d` 时会产生同化之外,`s+j` 以及 `z+j` 也**可能**会产生同化 —— 请注意,这两组是**可能**,并非一定,并非所有英文母语使用者都如此发音。`s+j` 可能会被读成 `ʃ`,`z+j` 可能会被读成 `ʒ`。比如,*Miss you so much.* `/mɪ ʃu səʊ mʌʧ./`;*It was your job.* `/ɪt wɒ ʒʊr ʤɒb./`。 + ## 2.2.5.4. 弹舌音 这是**美式**发音的一个特点 —— `t` 被夹在两个元音之间的时候,可能是单词之内,也可能是单词之间,它会变成所谓的弹舌音,往往被标注为 `t̬`,被称为**弹舌音** (*alveolar flapping t*) —— 听起来非常接近 `d`。这种情况在英文语音中出现的情况实在太多,比如,*bottom*, *butter*, *daughter*, *here at our university*, *not at all*, *set it up*, *water*... diff --git a/1000-hours/sounds-of-english/22-r.md b/1000-hours/sounds-of-english/22-r.md index 82c05866a..7ca55d990 100644 --- a/1000-hours/sounds-of-english/22-r.md +++ b/1000-hours/sounds-of-english/22-r.md @@ -4,6 +4,7 @@ +与 `l` 一样([2.2.11](23-l)),处于元音之后的 `r` 由于有完整的舌尖动作,会使之前的元音附加一个音标标注里看不到的 `ə`,比如: - -#### \ No newline at end of file +> * *fear* `/fɪr/` → `/fɪər/` +> * *wear* `/wer/` → `/weər/` \ No newline at end of file diff --git a/1000-hours/sounds-of-english/23-l.md b/1000-hours/sounds-of-english/23-l.md index 2ee075b19..5af8f0497 100644 --- a/1000-hours/sounds-of-english/23-l.md +++ b/1000-hours/sounds-of-english/23-l.md @@ -10,4 +10,16 @@ 所以,要格外注意 `l` 在元音之后的情况,注意舌尖位置正确,动作完整,不能有嘴唇动作 —— 否则就会出现 `ʊ` 音。 - \ No newline at end of file + + +格外需要注意的是,由于处于音节末尾的 `l` 有这个完整的舌尖动作,于是,它之前的`ɪ`、`iː`、`eɪ`、`e`、`æ` 都会附加这一个未标注音标的 `ə` 音 —— 完整舌尖动作的自然结果。 + +> * seal `/siːl/` → `/siːəl/` +> * fill `/fɪl/` → `/fɪəl/` +> * tale `/teɪl/` → `/teɪəl/` +> * well `/wel/` → `/weəl/` +> * shall `/ʃæl/` → `/ʃæəl/` + +注意,`r` 之前也常常有同样的现象([2.2.10](22-r))。 + +另外,`l` 和 `m`、`n` 一样,有时也会使之前的辅音变成**音节辅音**([2.2.3](15-mn))。比如,*little* `/ˈlɪt̩l/`(注意,这里的 `t` 会被浊化,变成弹舌音 `t̬`,听起来像是 `d`),*awful* `/ˈɔf̩l/`。 \ No newline at end of file diff --git a/1000-hours/sounds-of-english/25-jw.md b/1000-hours/sounds-of-english/25-jw.md index 24e9ec3cc..6bf0b539e 100644 --- a/1000-hours/sounds-of-english/25-jw.md +++ b/1000-hours/sounds-of-english/25-jw.md @@ -18,4 +18,6 @@ > * *Do it* - `/ˈduː ˈɪt/` ⭢ `/ˈduːwɪt/` > * *Throw it* - `/ˈθrəʊ ˈɪt/` ⭢ `/ˈθrəʊwɪt/` -之前提到过的例子 *individual* `/ˌɪndɪˈvɪdʒəwəl/`([2.1.4](07-ə), [2.2.11](23-l)),是个多音节词汇,如果仔细看的话,就会发现,后半部分, /`dʒə-wəl/` ,其实也是 `/dʒju-əl/` 经过 *intrusion* 插入了一个 `w` 而演化过来的。 \ No newline at end of file +之前提到过的例子 *individual* `/ˌɪndɪˈvɪdʒəwəl/`([2.1.4](07-ə), [2.2.11](23-l)),是个多音节词汇,如果仔细看的话,就会发现,后半部分, /`dʒə-wəl/` ,其实也是 `/dʒju-əl/` 经过 *intrusion* 插入了一个 `w` 而演化过来的。 + +另外,请注意复习一下 `t+j`、`d+j`、`s+j`、`z+j` 可能会产生的同化现象([2.2.5.3](17-td#_2-2-5-3-同化))。 \ No newline at end of file diff --git a/1000-hours/sounds-of-english/26-catenation.md b/1000-hours/sounds-of-english/26-catenation.md index 42f3aea0e..f3b23b74f 100644 --- a/1000-hours/sounds-of-english/26-catenation.md +++ b/1000-hours/sounds-of-english/26-catenation.md @@ -18,7 +18,7 @@ > * 非重音上的元音常常被简化成 ` ə`([2.1.4](07-ə)) > * `t, d` 常常有各种变化([2.2.5](17-td)): -> * 省音( *elision*,[2.2.5.1](17-td#_2-2-5-1-省音)) +> * 省音(*elision*,[2.2.5.1](17-td#_2-2-5-1-省音)) > * 叠音(*geminates*,[2.2.5.2](17-td#_2-2-5-2-叠音)) > * 同化(*assimilation*,[2.2.5.3](17-td#_2-2-5-3-同化)); > * 弹舌音 (*alveolar flapping*,[2.2.5.4](17-td#_2-2-5-4-弹舌音)) diff --git a/1000-hours/sounds-of-english/36-long-short.md b/1000-hours/sounds-of-english/36-long-short.md index f8138ecbb..9554c402b 100644 --- a/1000-hours/sounds-of-english/36-long-short.md +++ b/1000-hours/sounds-of-english/36-long-short.md @@ -6,7 +6,7 @@ 所以,说话的过程就是**把每个音节安排好**的过程。 -传统外语教学对自然语音中**韵律**(*prosody*)和**节奏**(*beats*)的重视程度并不足够,重视得也不够全面。 +传统外语教学对自然语音中**韵律**(*prosody*)和**节奏**(*rhythm*)的重视程度并不足够,重视得也不够全面。韵律节奏长期以来一直是母语教学中所谓最高级的部分才会深入讲解的领域:诗词创作。 曾经,传统外语教学只会泛泛提及**声调**的**起伏**,并且,基本上仅限于祈使句与疑问句之中那些处于句末以词汇为单位的明显声调变化。 diff --git a/1000-hours/training-tasks/ai.md b/1000-hours/training-tasks/ai.md index 174295701..862f1656d 100644 --- a/1000-hours/training-tasks/ai.md +++ b/1000-hours/training-tasks/ai.md @@ -1,4 +1,4 @@ # 人工智能 -人工智能在生活中的应用非常多,但,最有用的地方(无需附加上 “之一”)可能是用来提高我们的**语言使用能力**。毕竟,现在的人工智能都是基于**大语言模型**的,所以,它们天然在语言领域更为灵活更为强大。 +人工智能在生活中的应用非常多,但,最有用的地方(无需附加上 “之一”)是用来提高我们的**语言使用能力**。毕竟,现在的人工智能都是基于**大语言模型**的,所以,它们天然在语言领域更为灵活更为强大。 diff --git a/1000-hours/training-tasks/kick-off.md b/1000-hours/training-tasks/kick-off.md index 40313a476..9931a63ab 100644 --- a/1000-hours/training-tasks/kick-off.md +++ b/1000-hours/training-tasks/kick-off.md @@ -47,13 +47,13 @@ AI 辅助工具,付费方案最好的是 [OpenAI](https://openai.com/),无 如果做不到**每天三小时**,那就算了吧 —— 当然,其实谁都可以做到的。 -起作用的只有**大声开口练习**。注意,一定是**大声**;虽然开口了,但只不过是小声嘟囔,不算数。当然,也没必要**喊** —— 首先,声带的确需要保护,其次,我们需要练习的是主要是**舌头**、**嘴唇**,以及**呼吸**,声带还真不是练习的重点。 +起作用的只有**大声开口练习**。注意,一定是**大声**;虽然开口了,但只不过是小声嘟囔,不算数。当然,也没必要**喊** —— 首先,声带的确需要保护,其次,我们需要练习的主要是**舌头**、**嘴唇**、**喉咙**、以及**呼吸**,声带还真不是练习的重点。 虽然最好是**连贯的三小时**,但,**一天之内累计三小时**也可以。 **碎片时间**也可以利用。把跟读录音存到可以同步云端的音乐播放器里(比如 iOS/macOS 内建的 Music),随时循环播放(戴单只耳机听,如此这般,万一自己可以跟读,自己的声音也同时听得更清楚)—— 这跟学唱歌一样,听得越多细节越熟悉。学歌的时候,不唱的时候不也要经常多听几遍吗?只不过,这样的碎片练习最好不要计入**三小时**之内。 -**准备文本**的工作,最好在前一天白天的时候抽空做 —— 这也可以利用碎片时间陆陆续续做完。这样可以节省自己宝贵的精力。 +**准备文本**的工作,最好提前一天抽空做 —— 这也可以利用碎片时间陆陆续续做完,这样可以节省自己宝贵的精力。 三小时之外,如果你有时间精力,依然应该花时间输入英文,无论是阅读、还是听有声书或者看视频影视剧集。 @@ -81,8 +81,8 @@ AI 辅助工具,付费方案最好的是 [OpenAI](https://openai.com/),无 > * **语音塑造** > * **记忆扩展** -**记忆**是一切思维活动的基础。我们所说的每一句话、每一个词汇,甚至每一个音节,都来自于我们的记忆。即便是创造,也只能完全建立在极大记忆容量的基础之上。一个人记忆力差,就好像是一台电脑配置的内存太小一样,处理什么都超级慢,数据量稍微大一点就会当场死机。 +**记忆**是一切思维活动的基础。我们所说的每一句话、每一个词汇、甚至每一个音节,都来自于我们的记忆。即便是创造,也只能完全建立在极大记忆容量的基础之上。一个人记忆力差,就好像是一台电脑配置的内存太小一样,处理什么都超级慢,数据量稍微大一点就会当场死机。 -训练任务中的文本,是**自己想要说的话**,也正因如此,背诵难度实际上并不高,毕竟,其中的概念与逻辑,都来自于你原本的记忆。只不过,现在用的是另外一种语言,所以,增加了一点难度而已。但是,在塑造语音的过程中,无数次的反复,又从另外一方面降低了难度。于是,总体上还是很容易做到。 +训练任务中的文本,是**自己想要说的话**,也正因如此,背诵难度实际上并不高,毕竟,其中的概念与逻辑,都来自于你原本的记忆。只不过,现在用的是另外一种语言,增加了一点难度而已。但是,在塑造语音的过程中,无数次的反复,又从另外一方面降低了难度。所以,总体上还是很容易做到。 -如果一天你能彻底记住 1 分钟的内容,一年下来就是 300 多分钟,加起来就是 5 个小时的内容…… 想想吧,如果你能滔滔不绝连续讲 5 个小时的话,你的语言能力在人群中必然能够超越 99% 以上的人群 —— 无论使用哪一种语言。 +如果一天你能完整记住 1 分钟的内容,一年下来就是 300 多分钟,加起来就是 5 个小时的内容…… 想想吧,如果你能滔滔不绝连续讲 5 个小时的话,你的语言能力必然能够超越 99% 以上的人群 —— 无论使用哪一种语言。 diff --git a/1000-hours/training-tasks/language.md b/1000-hours/training-tasks/language.md index 94f2f89f6..da737682b 100644 --- a/1000-hours/training-tasks/language.md +++ b/1000-hours/training-tasks/language.md @@ -2,13 +2,13 @@ 你有没有认真想过,我们经常提起或者偶尔称赞的**文笔**或者**口才**指的到底是什么呢? -文字是用来记录并传递感知的。所以,一个人能用的名词,往往局限在他能够感知的事物的总和,不管是抽象的还是具体的。他们能用的动词,就是这个集合里的事物能够发出或者承载的动作。 +文字是用来记录并传递感知的。所以,一个人能用的名词,往往局限在他能够感知的事物的总和之中,不管是抽象的还是具体的。他们能用的动词,就是这个集合里的事物能够发出或者承载的动作。 **具体事物**,见过就知道,没见过就不知道也很容易理解。能用语言描述具体的事物及其对他们的感知,可以算作是**基础语言能力**了吧? 这基础之上的才可以被称为**文采**或者**口才**吧? -毫无疑问,**抽象事物**的数量一直在不断增加,并且发展得越来越快。亚里士多德显然是个天才,但他不知道**重力**的存在;发明了望远镜的伽利略当然好奇过天上底有多少颗星星,可天才如他也无法想象许多年后才有科学家想到了个用照片图像上的**景深**去估算恒星数量的方法;伽利略肯定也没听说过**进化**这个概念;达尔文不可能知道什么是**量子纠缠**或者**指数基金**。 +毫无疑问,**抽象事物**的数量一直在不断增加,并且发展得越来越快。亚里士多德显然是个天才,但他不知道**重力**的存在;发明了望远镜的伽利略当然好奇过天上到底有多少颗星星,可天才如他也无法想象许多年后有科学家想到了个用照片图像上的**景深**去估算恒星数量的方法;伽利略肯定也没听说过**进化**这个概念;达尔文不可能知道什么是**量子纠缠**或者**指数基金**。 “幸福” 这样普遍的抽象概念虽然理解上并不统一,但大家好像早都知道,也不需要教育。但更多的抽象概念,比如,**适者生存**,**双盲测试**,**举证责任**,**基尼系数**,**皮格马利翁效应**,**梅特卡夫定律**,**摩尔定律**,**聚光灯效应**,**贝叶斯定理**…… 这些今天的人们可能习以为常的抽象概念,往往需要数年的教育或者自我教育才可以真正习得并熟练应用。 @@ -16,7 +16,7 @@ 先不说那些高级的**修辞**,单说对一个事物的**形容**,即,普通的形容词,人与人之间的差异也非常大。 -如果一个人对一个他能够感知到的事物只有一方面的感知,那么针对这个事物,他可用的形容词也就只有一个,不可能是多个。比如,同样一部电视剧,很多人只有一个感受,“好看”。另外一个人的描述却是,“这是一个画面华丽,情绪充沛,却故事单薄,人物拉垮,但反过来又因为这个时代的品味而大火特火的电视剧”。与其说这是文采,不如说这只是对同一事物更多角度的观察、感知与思考最终在语言上的体现。 +如果一个人对一个他能够感知到的事物只有一方面的感知,那么针对这个事物,他可用的形容词也就只有一个,不可能是多个。比如,同样一部电视剧,很多人只有一个感受,“好看”;而另外一个人的描述却是,“这是一个画面华丽,情绪充沛,却故事单薄,人物拉垮,但反过来又因为这个时代的品味而大火特火的电视剧”。与其说这是文采,不如说这只是对同一事物更多角度的观察、感知与思考最终在语言上的体现。 有人喜欢**押韵**,有人善用**类比**,有人擅用**隐喻**,有人以**排比**为乐,有人以**旁征博引**为荣。 @@ -24,7 +24,7 @@ 一个人能用精确且又出人意料的**类比**,说明他能看到别人看不到的不同事物之间的关联,并且还能在众多的关联里挑出最准确最令人震惊的那个…… 这可是非常了不起甚至罕见的技能。 -一个人能不动声色的用好各种**隐喻**,往往来自整个文化的长期影响。比如,同样说,“他就是一个**棋子**” — 这倒真是全球通用的一个隐喻,毕竟,**人生如棋**…… 但,接下来,这个 “棋子” 到底是什么呢?欧洲人可能在 *Knight*, *Bishop*, 和 *Pawn* 中选择(国际象棋);而中国人呢?车马炮,或者卒(中国象棋)。 +一个人能不动声色地用好各种**隐喻**,往往来自整个文化的长期影响。比如,同样说,“他就是一颗**棋子**” — 这倒真是全球通用的一个隐喻,毕竟,**人生如棋**…… 但,接下来,这个 “棋子” 到底是什么呢?欧洲人可能在 *Knight*, *Bishop* 和 *Pawn* 中选择(国际象棋);而中国人呢?车马炮,或者卒(中国象棋)。 至于**排比**和**旁征博引**么,毫无疑问,都需要更多额外的功课,因为现编总是来不及的。 diff --git a/1000-hours/training-tasks/procedures.md b/1000-hours/training-tasks/procedures.md index d966852f2..623893605 100644 --- a/1000-hours/training-tasks/procedures.md +++ b/1000-hours/training-tasks/procedures.md @@ -6,7 +6,7 @@ 在挣扎着**读准**之前,**首先要避免读错**。这只是一个习惯,遇到任何不确定的词汇都要查词典 —— 当然,在有各种辅助工具的情况下([GPT: Phonetic Transcriber](https://chat.openai.com/g/g-nWwuxUVqO-phonetic-transcriber)),甚至可以整句查询音标。 -忘文生音非常可怕。我曾经在很多年里把 *facade* 读成 `/ˈfækeɪd/` (其实是 `/fəˈsɑːd/`)把 *specific* 读成 `/ˈspesɪfɪk/` (其实是 `/spəˈsɪfɪk/`)…… 不妨再猜猜 *plaid* 这个词怎么读?我在很长一段时间里误以为是 `/pleɪd/` …… 后来才发现并非如此 —— 其实是 `/plæd/`:。 +望文生音非常可怕。我曾经在很多年里把 *facade* 读成 `/ˈfækeɪd/` (其实是 `/fəˈsɑːd/`)把 *specific* 读成 `/ˈspesɪfɪk/` (其实是 `/spəˈsɪfɪk/`)…… 不妨再猜猜 *plaid* 这个词怎么读?我在很长一段时间里误以为是 `/pleɪd/` …… 后来才发现并非如此 —— 其实是 `/plæd/`:。 如果不养成这个习惯,那么读错的单词会越来越多,等于时时刻刻在为自己的牢墙添砖加瓦,到最后再也无法逃脱 —— Github 上有个[常见中国程序员发音错误的单词列表](https://github.com/shimohq/chinese-programmer-wrong-pronunciation),不妨去看看,当作自己的警钟。 @@ -27,7 +27,7 @@ > * 元音([2.1](/sounds-of-english/03-vowels-overview)) > * 辅音([2.2](/sounds-of-english/12-consonants-overview)) -**仔细听**的意思是说,按照以上的顺序,逐条分析,直至每个**音素**都认真分析过、认真体会过、认真尝试过。这一步最需要**注意力集中**,也是整个训练中最关键的部分 —— 这场训练,从另外一个角度来看,全部都是**注意力训练**。 +**仔细听**的意思是说,按照以上的顺序,逐条分析,直至每个**音素**都认真分析过、认真体会过、认真尝试过。这一步最需要**注意力集中**,也是整个训练中最关键的部分 —— 这场训练,从另外一个角度来看,实际上都是**注意力训练**。 如果这一点没做到、没做好的话,就会出现 “**明明听到的是一回事,脑子里反应的却是另外一回事**”。 @@ -57,11 +57,11 @@ - 可即便放慢速度了也不行…… 于是,只能一小节一小节地练,练熟了一小节再去练下一小节,两个都练熟了之后吧,还得拼起来重复很多遍才能做到两个小节之间衔接自然…… 如此这般,一小节一小节地终于 “**爬**” 完之后,才算有资格可以进行**正式练习**了…… + 可即便放慢速度了也不行…… 于是,只能一小节一小节地练,练熟了一小节再去练下一小节,两个小节都练熟了之后吧,还得拼起来重复很多遍才能做到两个小节之间衔接自然…… 如此这般,一小节一小节地终于 “**爬**” 完之后,才算有资格可以进行**正式练习**了…… 自然语音中有**可换气停顿**的地方,就相当于是乐谱里的小节分界线。分段练习,实在难的小节,还可以继续拆分…… -在跟读的时候,有必要**夸张**一点**。声音也要正常地大** —— 确实不用喊,嗓子的确需要保护。实际上,我们主要需要练的是嘴唇、舌头、气流震动的配合,主要练的还真不是声带。 +在跟读的时候,有必要**夸张**一点。声音也要正常地**大** —— 确实不用喊,嗓子的确需要保护。实际上,我们主要需要练的是嘴唇、舌头、气流震动的配合,主要练的还真不是声带。 跟读的时候,可以戴着耳机。一个比较好的方法是戴单只耳机 —— 这样,一方面录音听得更清楚,另外一方面也不妨碍听清自己的声音,还可以换着耳朵戴。 @@ -119,4 +119,4 @@ TED 上有一个讲座,Benjamin Zander 讲 [The transformative power of classi 一天至少三个小时,每周最多可以中止一天。 -每天结束之前,要花 5~10 分钟做一下**复盘**,回忆并记录一下自己今天遇到的困难、已经克服的困难,尚未克服的困难,以及面对那些困难时所采用的方法…… 想一想还有什么方法可以试试?这些都要写下来。相信我,记录这个东西 ,总是会以想象不到的方式起想象不到的作用。 \ No newline at end of file +每天结束之前,要花 5~10 分钟做一下**复盘**,回忆并记录一下自己今天遇到的困难、已经克服的困难、尚未克服的困难、以及面对那些困难时所采用的方法…… 想一想还有什么方法可以试试?这些都要写下来。相信我,记录这个东西 ,总是会以想象不到的方式起想象不到的作用。 \ No newline at end of file diff --git a/1000-hours/training-tasks/wonder.md b/1000-hours/training-tasks/wonder.md index d3d92ad08..30b1497b7 100644 --- a/1000-hours/training-tasks/wonder.md +++ b/1000-hours/training-tasks/wonder.md @@ -1,6 +1,6 @@ # 5. 效果非常惊人 -最更惊人的是,在人工智能的辅助之下,我的第一语言使用水平也可以用同样的方式提高。在此之前,我们通常都是**眼高手低**的 —— 我们的实际能力常常远远低于我们的**审美**。就好像我们都知道什么好吃,但真的做不出那么好吃的东西一样。但现在不一样了,突然之间,能力追上了审美,想要再提高,竟然需要做的只不过是**提高审美标准**而已…… +最惊人的是,在人工智能的辅助之下,我的第一语言使用水平也可以用同样的方式提高。在此之前,我们通常都是**眼高手低**的 —— 我们的实际能力常常远远低于我们的**审美**。就好像我们都知道什么好吃,但真的做不出那么好吃的东西一样。但现在不一样了,突然之间,能力追上了审美,想要再提高,竟然需要做的只不过是**提高审美标准**而已…… 作为岁数已经不小了的成年人,我想到了一个令自己无比震惊的可能性 —— 我们完全有机会在人工智能辅助下,通过一段时间的训练,生生把英语变成自己的第一语言。这在过去当然会被认为完全不可能,现在呢?现在真的不一样了。 diff --git a/1000-hours/what.md b/1000-hours/what.md index 4cc0362bb..894d3f12d 100644 --- a/1000-hours/what.md +++ b/1000-hours/what.md @@ -2,17 +2,17 @@ 在过去的两百多年时间里,一方面是大多数人体力变得越来越差,另外一方面是那些主动健身的人成绩越来越好。人们投入了无数的时间与精力去研究如何提高成绩。 -马拉松运动员为了跑得更快,改变了呼吸方式、改变了跑步姿势,甚至在不断研究如何改进运动鞋,使用更先进的材质把跑鞋改得越来越轻;与此同时,出于自我保护,关于跑鞋怎么做才能更好地减震,迄今为止也不知道更新多少次专利。 +马拉松运动员为了跑得更快,改变了呼吸方式、改变了跑步姿势,甚至在不断研究如何改进运动鞋 —— 使用更先进的材质把跑鞋改得越来越轻;与此同时,为了使跑鞋更好地减震以便更有效地保护运动员,迄今为止也不知道更新了多少专利。 -登山运动员也一样,除了各种训练方式的改进之外,所有的设备包括登山绳、登山锤、登山鞋和手套都在不断改良,为了减重,通过科研,把所有衣服的材质全都更换了不知道多少遍,保暖衣在越来越薄越来越轻的同时,不仅能更好地吸汗还能更好地透气。 +登山运动员也一样,除了各种训练方式的改进之外,所有的装备包括登山绳、登山锤、登山鞋和手套都在不断改良,为了减重,通过科技手段,所有衣服的材质全都被更换了不知道多少遍,保暖衣在越来越薄越来越轻的同时,既能更好地吸汗还能更好地透气。 -在健身房里,人体的骨骼肌总计 600 多块,其中的每一块肌肉都有许多种专门的训练方法,并且往往有专门的设备可供使用,并且永远不止一种可供选择…… 并且,无论是方法还是设备,都在不断研究不断改进。 +人体的骨骼肌总计 600 多块。在健身房里,每一块肌肉都有许多种专门的训练方法,并且往往有不止一种专门的器械可供使用,并且永远不止一种可供选择…… 并且,无论是方法还是器械,都在不断研究不断改进。 遗憾的是,在健脑方面,人类基本停留在百年甚至千年之前。人们不知道有哪些部位需要训练,甚至压根就没想到还有健脑的必要,当然也因此完全不存在什么针对性训练及其相关设备。 幸运的是,最佳的健脑项目过于显而易见 —— **锻炼自然语言使用能力**,无论哪一种语言。 -**掌握并使用自然语言**,也许是所有人终生所能遇见的最复杂且有最系统的大脑工作任务。令人惊讶的是,与此同时,对大脑来说,掌握并使用自然语言,其实并不是生存必需…… 胃坏了牙坏了肯定不行,聋了哑了其实并无所谓,毕竟聋哑实际上并不影响一个人的寿命。 +**掌握并使用自然语言**,也许是所有人终生所能遇见的最复杂且又最系统的大脑工作任务。令人惊讶的是,与此同时,对大脑来说,掌握并使用自然语言,其实并不是生存必需…… 胃坏了牙坏了肯定不行,聋了哑了其实并无所谓,毕竟聋哑实际上并不影响一个人的寿命。 自然语言可以很简单。日常生活里,人们大约只需要 500~1000 的词汇量就足够完成日常必要沟通。当然,自然语言也可以无限复杂。现代汉语大词典收录单字字头 13,000 多个,各类词语 156,000 多条;而牛津英语词典收录了 301,000 个词条。 @@ -20,7 +20,7 @@ 科学,主要使用的是**人工语言**。人工语言是自然语言的一个子集,由相对极少的词汇与一些作为补充的符号构成 —— 数学如此、物理如此,化学如此,计算机的编程语言也是如此。从自然语言中提取精简且又系统的人工语言,是人类的一大创举,也使得人类的智慧可以迅速积累极大提高。与此同时,主要由人工语言构成的知识,到最后还是得靠自然语言才能更大面积传播。 -与之相对的,我们在学校里花最长时间学习的,也是语文课,从开始上学一直到学校毕业。不仅如此,到了近代,全球的教育体系都一样,都纳入了第二语言学习,同样贯穿整个在校教育过程 —— 虽然效果并不怎么样。 +与之相对的,我们在学校里花最长时间学习的,也是语文课,从开始上学一直到学校毕业。不仅如此,到了近代,全球的教育体系都一样,都纳入了第二语言学习,且同样贯穿整个在校教育过程 —— 虽然效果并不怎么样。 实际上,如果我们肯穿过表象看透实质的话,学校里的一切课程都是语文课 —— 本质上都是老师们在用**自然语言**讲授用**人工语言**记录并传播的**知识**。很多人数理化成绩不佳,底层原因其实是语文问题。科学知识本身没多复杂,但,语文基础不过关的结果是,课程听不懂,或者题目读不懂,理解不完整,甚至干脆理解错误,这才导致了最终浮现在表面的那些千奇百怪的问题。 @@ -30,16 +30,16 @@ 你跑马拉松,无论如何也不可能只用 3 分钟跑完;你登山,地球上也没有海拔 10,000 米以上的山峰可以让你爬,你去健身,无论怎么练也不可能把自己练成 200 公斤以上 —— 据说目前地球上最重的健身运动员体重是 400 磅,身高 193 厘米,每天要摄入 12,000 卡路里才行,那也只不过是 181.44 公斤。 -可自然语言使用能力不一样,无限空间无限可能。你可以把它练得更好,使自己的日常沟通更为有效,或者让自己通过公开讲演获得更多的影响力;你也可以用它写书,小说或者非小说;你还可以用它写剧本,电视、电影、短剧…… 你还可以学习并使用多种语言,每一种语言都有同样无限的可能性…… 没有尽头。 +可自然语言使用能力不一样,无限空间无限可能。你可以把它练得更好,使自己的日常沟通更为有效,或者让自己通过公开讲演获得更多的影响力;你也可以用它写书,虚构类或者非虚构类;你还可以用它写剧本、电视、电影、短剧…… 你还可以学习并使用多种语言,每一种语言都有同样无限的可能性…… 没有尽头。 自然语言使用之于脑力正如马拉松之于体力。如果,跑步是最为普适的**健身运动**,那么,自然语言使用就是最有趣且最为普适的**健脑运动**。 显然,跑步相对于自然语言使用来看更为枯燥。事实上,一切体育运动相对于自然语言使用来看都显得枯燥许多,因为自然语言是更大的更复杂的网络,由更多的节点构成。用得不好就算了,用得好的话,有趣的地方实在是太多。 -**跑步**锻炼最多使用最多的是对体力运动来说最重要的器官,**心**与**肺**。而**自然语言使用**对应的是大脑里的**白质**与**灰质**。语言能力更强的人以及多语使用者,从大脑结构上来看,他们都比其他人拥有相对覆盖面积更大的**白质**和密度更高体积更大的**灰质** —— **这不是天生的,这只能是后天训练的结果**。 +**跑步**锻炼最多使用最多的是对体力运动来说最重要的器官,**心**与**肺**。而**自然语言使用**对应的是大脑里的**白质**与**灰质**。语言能力更强的人以及多语使用者,从大脑结构上来看,他们都比其他人拥有相对覆盖面积更广的**白质**和密度更高体积更大的**灰质** —— **这不是天生的,这只能是后天训练的结果**。 关键在于,白质和灰质不止用来处理语言…… 事实上,人类无论做什么都用它们靠它们。白质的主要功能之一是协调大脑的各个部分,它的**覆盖面积**越广,大脑各部分之间的**协同效率就**越高。**灰质**是中枢神经系统对信息进行深入处理的部位,它的**密度**越高**体积**越大,人就越聪明,因为那里已经存储、相互关联、可以处理的信息就越多。 脑科学家们对各类专家的大脑进行扫描的结果发现,虽然大家术业有专攻,但到最后,这些人的大脑都具备相同的表征 —— 都是白质覆盖面积相对更广,灰质密度相对更高、灰质体积也相对更大。与此同时,白质覆盖面积相对更广、灰质密度相对更高、灰质体积相对更大的人,无论学什么都更快,无论做什么都更好。不仅如此,这样的人还更擅长处理多任务,所以做事的时候总是效率更高。总而言之,他们的**大脑可塑性**总是相对更强。 -并且,随着年龄增加,白质覆盖面积相对更广、灰质密度相对更高、体积相对更大的人,抗衰老能力更强。所谓的**耳聪目明**,实际上并不是耳膜或者眼角膜所决定的,真正决定视力和听力的其实是大脑。如果大脑出了问题,即便耳膜眼角膜都正常,视力和听力也都会出问题。所以,更大覆盖面积的白质,密度更高体积更大的灰质,自然会延缓大脑衰老,也能预防很多老年疾病,比如帕金森症综合症。对普通人都适用的是,更好的大脑机能显然会更少罹患抑郁症。 \ No newline at end of file +并且,随着年龄增加,白质覆盖面积相对更广、灰质密度相对更高、体积相对更大的人,抗衰老能力更强。所谓的**耳聪目明**,实际上并不是耳膜或者眼角膜所决定的,真正决定视力和听力的其实是大脑。如果大脑出了问题,即便耳膜眼角膜都正常,视力和听力也都会出问题。所以,更广覆盖面积的白质,密度更高体积更大的灰质,自然会延缓大脑衰老,也能预防很多老年疾病,比如帕金森症综合症。对普通人都适用的是,更好的大脑机能显然会更少罹患抑郁症。 \ No newline at end of file diff --git a/enjoy-docs/.gitignore b/enjoy-docs/.gitignore new file mode 100644 index 000000000..afca1161e --- /dev/null +++ b/enjoy-docs/.gitignore @@ -0,0 +1,139 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +.DS_Store +./public/jupyter-notebooks/*.mp3 + +.vitepress/cache/ + +.jupyter +.ipynb_checkpoints + diff --git a/enjoy-docs/.vitepress/config.mts b/enjoy-docs/.vitepress/config.mts new file mode 100644 index 000000000..49e70fc73 --- /dev/null +++ b/enjoy-docs/.vitepress/config.mts @@ -0,0 +1,93 @@ +import { defineConfig } from "vitepress"; + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + lang: "zh-CN", // 'en-US + title: "Enjoy App", + description: "Enjoy 用户手册", + head: [ + [ + "script", + { async: "", src: "https://www.googletagmanager.com/gtag/js?id=G-RY5XCM04NL" }, + ], + [ + "script", + {}, + `window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments);} + gtag('js', new Date()); + gtag('config', 'G-RY5XCM04NL');`, + ], + ["link", { rel: "icon", href: "/favicon.ico" }], + ], + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + logo: "/logo.png", + nav: [{ text: "用户手册", link: "/markdown-examples" }], + + sidebar: [ + { + text: "快速开始", + collapsed: false, + items: [ + { text: "简介", link: "/guide/intro" }, + { text: "下载安装", link: "/guide/install" }, + { text: "软件设置", link: "/guide/settings" }, + ], + }, + { + text: "跟读训练", + collapsed: false, + items: [ + { text: "音频资源", link: "/guide/audios" }, + { text: "视频资源", link: "/guide/videos" }, + ], + }, + { + text: "阅读文本", + collapsed: false, + items: [ + { text: "在线文章", link: "/guide/webpage" }, + { text: "本地电子书", link: "/guide/ebook" }, + ], + }, + { + text: "智能助手", + collapsed: false, + items: [ + { text: "简介", link: "/guide/ai-assistant" }, + { text: "GPT 服务", link: "/guide/gpt-conversation" }, + { text: "TTS 服务", link: "/guide/tts-conversation" }, + ], + }, + { + text: "使用案例", + collapsed: false, + items: [ + { + text: "利用 AI 生成训练材料", + link: "/guide/use-case-generate-audio-resources", + }, + ], + }, + ], + + socialLinks: [ + { + icon: "github", + link: "https://github.com/xiaolai/everyone-can-use-english/tree/main/enjoy-docs", + }, + ], + + editLink: { + pattern: + "https://github.com/xiaolai/everyone-can-use-english/edit/main/enjoy-docs/:path", + text: "在 GitHub 上编辑此页面", + }, + + search: { + provider: "local", + }, + }, + lastUpdated: true, +}); diff --git a/enjoy-docs/guide/ai-assistant.md b/enjoy-docs/guide/ai-assistant.md new file mode 100644 index 000000000..7bfeed333 --- /dev/null +++ b/enjoy-docs/guide/ai-assistant.md @@ -0,0 +1,19 @@ +# 简介 + +所有智能助手均以 **对话** 的形式呈现,添加一个对话即添加一个智能助手。 + +左侧栏点击 `智能助手` 即可进入。 + +## 添加对话 + +点击 `新对话` 按钮,弹窗出现预设的 AI 角色,可以快速创建有用的智能助手,也可以选择自定义。 + +创建对话前,需要先填写相关的配置,最重要的几项是: + +- AI 类型,分为 [GPT](./gpt-conversation.md) 和 [TTS](./tts-conversation.md) 两种; +- AI 引擎,每次新建都将加载 [默认 AI 引擎](./settings.md#默认-ai-引擎),创建时可以修改,创建后无法修改; +- 角色定义,[GPT](./tts-conversation.md) 类型时可以定义,即将 AI 赋予一个特定的角色以得到想要的回答; + +## 修改对话 + +在对话页面,右上角齿轮可以打开对话的配置,进行修改,或者删除。需要注意的是,AI 类型和 AI 引擎无法修改,需要变更时请新建一个对话。 diff --git a/enjoy-docs/guide/audios.md b/enjoy-docs/guide/audios.md new file mode 100644 index 000000000..612fde45e --- /dev/null +++ b/enjoy-docs/guide/audios.md @@ -0,0 +1,58 @@ +# 音频资源 + +利用音视频资源进行跟读训练是 Enjoy 的核心功能之一。 + +## 添加音频资源 + +Enjoy 支持添加本地的音频资源,和在线资源。在音频页面,点击 `添加资源`,在弹窗中输入网址,或者点击 `本地文件` 选择本地计算机的音频文件即可添加。 + +如果是在线资源,Enjoy 会将文件下载至默认的下载文件夹(`Downdoads` 或者 `我的下载`),然后再自动添加至 [资源库](./settings#资源库保存路径)。 + +## 跟读音频 + +添加成功后,会自动跳转至音频播放页面。 + +打开时,需要先解析音频波形数据(并生成 Pitch contour)和生成音频字幕(使用 [语音转文本服务](./settings#语音转文本服务))。首次打开时,可能需要等待一些时间。所需数据生成成功之后,后续再次打开时的速度会比较快。 + +::: tip 卡在加载页面怎么办? +打开音频页面时,会先按照以下步骤进行加载: + +1. 解析音频波形数据 +2. 语音转文本 + +如果长时间卡在第一步,可能是因为音频太大(主要跟音频时长有关)导致加载时间过长,甚至失败。如果不是音频大小的原因,可能是出现了其他 bug,请联系开发者。 + +如果第二步语音转文本失败,请检查是否在正在使用本地 whisper 组件进行语音转文本,在某些电脑上可能因为兼容性和未知问题导致无法使用。如果出现这种情况,请在 [语音转文本服务设置](./settings#语音转文本服务) 中改用其他语音转文本的云服务。 +::: + +## 录音 + +Enjoy 会将音频按照句子切分,用户以句子为单位进行跟读练习。在激活的音频句子下,点击下方的录音按钮,即可开始录音,用户可以模仿音频朗读当前句子作为练习。 + +![音频播放页面](/snapshots/audio-page.png) +_\* 音频播放页面_ + +::: tip 录音权限 +在 Mac 电脑上,首次使用录音功能时,会弹窗请求麦克风的使用权限,请务必点允许,否则无法使用录音功能。 +::: + +## 发音评估 + +Enjoy 集成了微软 Azure 的发音评估功能,作为自我的发音检查参考。点击录音右下方的仪表盘图标,即可打开发音评估弹窗。 + +该功能会以**录音时的句子文本作为参考**,评估录音的发音情况,各指标的详细说明可以参考微软的 [官方文档](https://learn.microsoft.com/en-us/azure/ai-services/speech-service/how-to-pronunciation-assessment?pivots=programming-language-javascript#scripted-assessment-results)。 + +![发音评估示例](/snapshots/pronouce-assessment.png) +_\* 发音评估示例_ + +::: warning 发音评估的使用建议 +该功能是收费功能,每次使用均会在 Enjoy 账户的余额扣费,如果余额不足则需要 [充值](./settings#充值) 后才可继续使用。 + +根据实测,该功能对提高学习者的发音作用水平有限,其评估结果仅做参考,不应该过度依赖。 + +另外,我们正在开发一套更有效的发音评估体系,敬请期待。 +::: + +## 修改音频信息 + +在音频页面上方,切换至列表模式,即可以对音频进行修改操作,例如修改音频标题,添加描述,和删除音频等。 diff --git a/enjoy-docs/guide/ebook.md b/enjoy-docs/guide/ebook.md new file mode 100644 index 000000000..478687c98 --- /dev/null +++ b/enjoy-docs/guide/ebook.md @@ -0,0 +1,3 @@ +# 本地电子书 + +待开发,敬请期待。 diff --git a/enjoy-docs/guide/gpt-conversation.md b/enjoy-docs/guide/gpt-conversation.md new file mode 100644 index 000000000..d4a41bad7 --- /dev/null +++ b/enjoy-docs/guide/gpt-conversation.md @@ -0,0 +1,7 @@ +# GPT 服务 + +当 AI 类型选择 `GPT` 时,AI 将会根据 `角色定义` 来回答你提出的所有问题。 + +例如定义一个 `英语教练` 的角色,可以将你发的所有文字翻译成地道的英文表达,再配合 [TTS](./tts-conversation.md) 将其转化成语音,即可作为跟读的材料。 + +详情可以参照使用案例:[利用 AI 生成训练材料](./use-case-generate-audio-resources.md) diff --git a/enjoy-docs/guide/install.md b/enjoy-docs/guide/install.md new file mode 100644 index 000000000..cfc4d8072 --- /dev/null +++ b/enjoy-docs/guide/install.md @@ -0,0 +1,43 @@ +# 下载安装 + +Enjoy App 是一个跨平台的桌面应用,可以在 Windows、Mac 和 Linux 等电脑设备上运行。 + +请根据电脑设备的操作系统,下载相应的版本安装使用。 + +## Windows + +支持 Windows 10 以上版本。 + +[点击下载](https://github.com/xiaolai/everyone-can-use-english/releases/download/v0.1.0-alpha.12/Enjoy-0.1.0-alpha.12-Setup.exe) + +下载后,双击即可安装。 + +## Mac + +根据使用 Mac 电脑的芯片不同,需要下载不同的版本。 + +- [Silicon 芯片版本(arm64)](https://github.com/xiaolai/everyone-can-use-english/releases/download/v0.1.0-alpha.12/Enjoy-darwin-arm64-0.1.0-alpha.12.zip) +- [Intel 芯片版本(x64)](https://github.com/xiaolai/everyone-can-use-english/releases/download/v0.1.0-alpha.12/Enjoy-darwin-x64-0.1.0-alpha.12.zip) + +::: info 如何查看本机配置 +M1 以后的 Mac 电脑型号(M1、M2、M3),均为 Silicon 芯片。 + +如果你不清楚自己电脑的具体型号,可以点击屏幕左上方的  符号,在弹出来的菜单中,选择第一个选项 “关于本机(About This Mac)”,在弹出的窗口中,即可看到本机的硬件和系统配置。 + +如果显示的是 _Apple M 系列_,即为 Silicon 芯片。 +::: + +::: warning 警告 +推荐使用 macOS 12 及以上版本,macOS 11 可能无法使用部分功能。 +::: + +## Linux + +请根据不同发行版本选用安装文件。 + +- [下载 deb 版本](https://github.com/xiaolai/everyone-can-use-english/releases/download/v0.1.0-alpha.12/enjoy_0.1.0-alpha.12_amd64.deb) +- [下载 rpm 版本](https://github.com/xiaolai/everyone-can-use-english/releases/download/v0.1.0-alpha.12/enjoy-0.1.0.alpha.12-1.x86_64.rpm) + +## 历史版本 + +所有历史版本均可在 [这里](https://github.com/xiaolai/everyone-can-use-english/releases) 找到。 diff --git a/enjoy-docs/guide/intro.md b/enjoy-docs/guide/intro.md new file mode 100644 index 000000000..c1e7132ce --- /dev/null +++ b/enjoy-docs/guide/intro.md @@ -0,0 +1,7 @@ +# 简介 + +AI 是当今世界上最好的外语老师,Enjoy 做 **AI 最好的助教**。 + +::: warning 重要提示 +Enjoy App 的开发仍处于早期的快速迭代阶段,文档可能落后于开发,导致功能描述可能不符,以最新发布的软件版本为准。 +::: diff --git a/enjoy-docs/guide/settings.md b/enjoy-docs/guide/settings.md new file mode 100644 index 000000000..b346ee287 --- /dev/null +++ b/enjoy-docs/guide/settings.md @@ -0,0 +1,161 @@ +# 软件设置 + +Enjoy 只需要登录后即可直接使用,**无需其他设置**。但是,你仍然可以根据需要做个性化的设置。 + +打开 Enjoy 软件,点击左侧栏最下面的齿轮按钮,即可打开 `软件设置`。 + +## 资源库保存路径 + +::: info 设置路径 +软件设置 -> 基本设置 -> 资源库保存路径 +::: + +Enjoy 采用 **本地优先** 的设计原则,大部分数据均保存在本地,即 **资源库保存路径** 下。 +所谓资源库是一个名为 `EnjoyLibrary` 的文件夹,默认放置在 `My Documents` (即 `我的文档`)下。 + +随着 Enjoy 的使用时间增长,资源库文件夹里可能会产生比较大的缓存文件,导致占用空间较大。根据具体需要,你也可以修改资源库的路径,例如从 _C 盘_ 改到空间更大的 _D 盘_。 + +如果已经产生了数据,修改时,可以先把原来的 `EnjoyLibrary` 文件夹复制到目标路径下,再在 Enjoy 软件中点`修改`按钮,选中目标路径,然后重启软件,即可完成修改。 + +::: tip 资源库里都有什么 +打开 `EnjoyLibrary` 文件夹,你能看到类似以下的目录结构 + +``` +. +├── 2400xxxx +│   ├── audios +│   │   ├── 0687ae31c4178bbf0466503e56d887f8.mp3 +│   │   └── ... +│   ├── enjoy_database.sqlite +│   ├── recordings +│   │   ├── 025542894635903d5ea6f2395cb404c0.wav +│   │   └── ... +│   ├── speeches +│   │   ├── 0687ae31c4178bbf0466503e56d887f8.mp3 +│   │   └── ... +│   └── videos +│   ├── 23876d46305bae2e049c691872dd3cde.mkv +│   └── ... +├── cache +│   ├── 0687ae31c4178bbf0466503e56d887f8.json +│   └── ... +├── logs +│   ├── main.log +│   └── main.old.log +├── waveforms +│   ├── 0687ae31c4178bbf0466503e56d887f8.waveform.json +│   └── ... +└── whisper +│   ├── models +│   │   ├── tiny.en.bin +│   │   └── ... +``` + +- `/2400xxxx/`: 登录的 Enjoy 帐号 ID,该文件夹下的数据均是你使用产生的个人数据 + - `/2400xxxx/audios/`: 添加的音频文件 + - `/2400xxxx/speeches/`: TTS 生成的语音文件 + - `/2400xxxx/videos/`: 添加的视频文件 + - `/2400xxxx/recordings/`: 录音文件 + - `/2400xxxx/enjoy_database.sqlite`: 个人数据库文件 +- `/cache/`: 使用过程中产生的缓存文件,如果占用空间过大,可以安全地删除 +- `/logs/`: 保存软件运行的日志,用于帮助开发人员排除故障 +- `/waveforms/`: 音视频解码后的波形数据缓存 +- `/whisper/models`: 语音转文字服务软件 whisper 的模型文件 + +::: + +::: danger 个人数据安全 +`EnjoyLibrary/2400xxxx/` 文件夹下保存的均为使用 Enjoy 过程中产生的个人数据,请务必**不要删改**该文件夹下的任何文件,否则可能会导致数据丢失,或者使得 Enjoy 软件无法正常运行。 + +如前文所说,Enjoy 采用本地优先的设计原则,绝大部分数据并没有上传云服务器,请妥善保管好自己的个人数据。 +::: + +## OpenAI 配置 + +::: info 设置路径 +软件设置 -> 基本设置 -> OpenAi +::: + +配置 OpenAI API 密钥,可以在 [官网](https://platform.openai.com/api-keys) 申请。配置好的 OpenAI 服务可以在 [智能助手](./ai-assistant.md)、 [提取关键词汇](./webpage#提取关键词汇)、 [查单词](./webpage#查单词)、标注音标 等服务中使用。 + +- 密钥:OpenAI API 密钥 +- 模型:默认使用的模型 +- 接口地址:如果使用的是官方申请的密钥,则不需要填;否则请根据密钥提供方的信息填写。 + +::: warning 接口地址 +由于 OpenAI 在某些地区不提供服务,有些用户会使用第三方提供的中转服务。请务必根据服务提供方的信息填写好 **接口地址**。如果使用时出现报错,可能需要在接口地址结尾加上 `/v1`。 +::: + +## Google Generative AI 配置 + +::: info 设置路径 +软件设置 -> 基本设置 -> Google Generative AI +::: + +配置 Google Generative AI 的密钥,可以在 [官网](https://ai.google.dev/) 申请 。配置后可以在 [智能助手](./ai-assistant.md) 中选用 Google Generative AI 作为 AI 引擎。 + +## 语音转文本服务 + +::: info 设置路径 +软件设置 -> 基本设置 -> 语音转文本服务 +::: + +语音转文本(即 STT,Speech to Text)服务是 Enjoy 提供的核心功能之一,也是 [跟读训练](./audios.md#跟读音频) 的前提条件。 + +### 本地(whisper) + +该设置默认项为 `本地`,即利用 Enjoy 集成的 whisper 组件,完全利用本地计算机的算力提供 STT 服务,该服务完全免费。 + +Enjoy 软件集成了最小的 whisper 模型 `tiny.en`,如果电脑配置较高,可以选用更大的模型以提高语音转文本的准确度。点击 `模型` 按钮,在弹窗中选择相应的模型即可自动下载并选中。 + +::: tip 关于 whisper 模型的选择 +下载的 whisper 模型会保存在 `/EnjoyLibrary/whisper/models/` 文件夹下。如果自动下载失败,也可以到 [这里](https://huggingface.co/ggerganov/whisper.cpp) 手动下载,放置在该文件夹下,在 Enjoy 中即可以选中。 + +理论上,模型越大,识别的准确度也更高,但是运行得越慢,甚至在一些配置不高的电脑中无法运行。 + +凡是以 `.en` 结尾的模型均只支持英文,识别英文准确性也更高,例如 `base.en`;而不以 `.en` 结尾的模型则可以支持多种语言,例如 `base`。 +::: + +::: warning 检查本地 whisper 服务 +有些电脑或者系统(例如 macOS 11)可能会因为兼容性问题(或其他未知问题)无法使用本地的 whisper 服务。点击 `检查` 按钮即可检查 whisper 服务在本地计算机是否工作正常。如果提示无法正常工作,可以选用其他服务。 +::: + +### Azure AI STT + +利用微软 Azure AI 的语音识别 API 服务提供的 STT,该服务为**收费服务**,每次使用均会在 Enjoy 账户余额中扣费,,余额不足则需要 [充值](#充值) 后才可继续使用。 + +### Cloudflare AI STT + +利用 Cloudflare 提供的 whisper 云服务,该服务目前免费。经实测,对于一些时长较短的音频,识别会有较大误差。 + +### OpenAI STT + +利用 OpenAI 提供的 whipser 云服务,该服务需要[配置自己的 OpenAI 密钥](#openai-配置)。 + +## 默认 AI 引擎 + +::: info 设置路径 +软件设置 -> 基本设置 -> 默认 AI 引擎 +::: + +Enjoy 中提供了很多方便的功能,例如 [提取关键词汇](./webpage#提取关键词汇)、 [查单词](./webpage#查单词)、标注音标 等,均是利用 AI 服务来实现。 + +如果你有自己的 [OpenAI 密钥](#openai-配置),建议将 **默认 AI 引擎** 选为 `OpenAI`。 + +否则,可以选 `Enjoy AI`,由 Enjoy 提供该服务,每次使用均会在账户余额中扣费,余额不足则需要 [充值](#充值) 后才可继续使用。 + +## 充值 + +::: info 设置路径 +软件设置 -> 账户设置 -> 余额 +::: + +Enjoy 提供了部分收费的 AI 服务,均为 **按使用量收费**,每次使用会在余额中扣除相应的费用,直到余额不足,则停止提供该服务。 + +如果需要继续使用,请点击 `充值` 按钮进行充值。 + +::: danger 充值前须知 +需要特别注意的是,充值成功后将在 Enjoy 账户的余额体现,所有余额仅可作为支付 Enjoy 收费服务使用,**不支持退款**,**不支持提现**。 + +请谨慎考虑,按需充值。 +::: diff --git a/enjoy-docs/guide/tts-conversation.md b/enjoy-docs/guide/tts-conversation.md new file mode 100644 index 000000000..70a7534fe --- /dev/null +++ b/enjoy-docs/guide/tts-conversation.md @@ -0,0 +1,5 @@ +# TTS 服务 + +当 AI 类型选择 `TTS` 时,该对话将提供文本转语音(Text to Speech)服务,即 AI 会将你发出的任意文本转化成语音(音频文件)。生成的语音,可以直接添加至资源库进行跟读练习。 + +在设置里可以修改语音的角色。 diff --git a/enjoy-docs/guide/use-case-generate-audio-resources.md b/enjoy-docs/guide/use-case-generate-audio-resources.md new file mode 100644 index 000000000..8ce2ecd23 --- /dev/null +++ b/enjoy-docs/guide/use-case-generate-audio-resources.md @@ -0,0 +1,45 @@ +# 利用 AI 生成训练材料 + +用外语说我们自己想说的话是学习外语的其中一个重要目的。市面上的口语书实际上并不实用,因为那些话大都不是我们想要说的,我们需要创建专属自己的口语书。使用 Enjoy 可以很容易做到这一点。 + +## 确保 AI 服务正常 + +在开始之前,先要确保 AI 服务可以正常使用,要么配置好自己的 [OpenAI 密钥](./settings#openai-配置),要么使用 Enjoy 提供的 AI 服务并确保账户 [余额](./settings#充值) 充足。 + +## 创建英语教练 + +点击 Enjoy 左侧栏的 `智能助手` 进入页面,点击 `新对话` 开始创建。 + +角色定义选择预设的 `英语教练`。 + +![选择 AI 角色](/snapshots/select-ai-role.png) +_\* 选择 AI 角色_ + +具体配置里,根据具体情况,修改 AI 引擎 为 OpenAI 或者 Enjoy AI。如果使用 [OpenAI](./settings#openai-配置),可能还需要检查配置 `接口地址`。 + +将配置拉到最下面,`TTS 引擎` 也需要做相应配置。 + +![对话设置](/snapshots/conversation-form.png) +_\* 对话设置_ + +配置完成后,点击下面的 `确认` 按钮,即可创建成功。 + +## 发送任意文字 + +智能助手的使用跟聊天窗口类似,将你想要说的话发给 `英语教练`,作为回复,AI 会将你的文字翻译成地道的纽约腔英语。 + +## 生成语音 + +如果你对 AI 的回复感到满意,点击信息下方的朗读图标,将其转化为语音。 + +![英语教练对话](/snapshots/english-coach-gpt-conversation.png) +_\* 英语教练对话_ + +## 跟读训练 + +继而点击麦克风图标,将该语音加入资源库,进行跟读训练。 + +![添加跟读训练](/snapshots/conversation-add-speech-to-audio.png) +_\* 添加跟读训练_ + +随后也可以在 [音频页面](./audios.md) 找到该材料,继续练习。 diff --git a/enjoy-docs/guide/videos.md b/enjoy-docs/guide/videos.md new file mode 100644 index 000000000..e7d9a0df2 --- /dev/null +++ b/enjoy-docs/guide/videos.md @@ -0,0 +1,20 @@ +# 视频资源 + +视频资源的使用与 [音频资源](./audios.md) 基本一致。 + +![视频资源播放页面](/snapshots/video-page.png) +_\* 视频播放页面_ + +## 录音 + +在视频播放页面,需要录音时,可以点播放控制栏上的录音图标,视频将会被缩小至小窗,主界面上会显示录音按钮。 + +## 视频大小的限制 + +过大的视频文件会导致加载卡死而无法使用,目前 Enjoy 将添加视频的大小限制在 100 Mb,超过则会提示添加失败。 + +后续会针对大文件做相应优化,以支持更大的文件。 + +## Youtube 视频 + +Enjoy 支持添加 Youtube 视频,添加资源时直接输入 Youtobe 网址即可。当然前提是当前网络条件支持访问 Youtube。 diff --git a/enjoy-docs/guide/webpage.md b/enjoy-docs/guide/webpage.md new file mode 100644 index 000000000..4329beb23 --- /dev/null +++ b/enjoy-docs/guide/webpage.md @@ -0,0 +1,19 @@ +# 在线文章 + +点击左侧栏的 `文章` 进入。 + +输入文章的网址,即可开始阅读。 + +![文章阅读页面](/snapshots/story-page.png) +_\* 文章阅读页面_ + +## 提取关键词汇 + +打开文章后,Enjoy 将会智能提取该文章的关键词汇,并在文中标注。该功能需要 AI 引擎的支持,在 [默认 AI 引擎](./settings.md#默认-ai-引擎) 可以设置。 + +![关键词汇](/snapshots/story-key-vocabulary.png) +_\* 智能提取关键词汇_ + +## 查单词 + +在正文中选中任意单词或者短语,即可激活查单词服务,同样需要 [AI 引擎](./settings.md#默认-ai-引擎) 的支持。 diff --git a/enjoy-docs/index.md b/enjoy-docs/index.md new file mode 100644 index 000000000..a6e0e51c5 --- /dev/null +++ b/enjoy-docs/index.md @@ -0,0 +1,12 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: "Enjoy App" + tagline: AI 是最好的老师,我们做 AI 最好的助教 + actions: + - theme: brand + text: 快速开始 + link: /guide/intro +--- diff --git a/enjoy-docs/package.json b/enjoy-docs/package.json new file mode 100644 index 000000000..baf6463f2 --- /dev/null +++ b/enjoy-docs/package.json @@ -0,0 +1,11 @@ +{ + "name": "enjoy-docs", + "scripts": { + "dev": "vitepress dev", + "build": "vitepress build", + "preview": "vitepress preview" + }, + "devDependencies": { + "vitepress": "^1.0.0-rc.44" + } +} diff --git a/enjoy-docs/public/favicon.ico b/enjoy-docs/public/favicon.ico new file mode 100644 index 000000000..febbdb8d8 Binary files /dev/null and b/enjoy-docs/public/favicon.ico differ diff --git a/enjoy-docs/public/logo.png b/enjoy-docs/public/logo.png new file mode 100644 index 000000000..f024d53a1 Binary files /dev/null and b/enjoy-docs/public/logo.png differ diff --git a/enjoy-docs/public/snapshots/audio-page.png b/enjoy-docs/public/snapshots/audio-page.png new file mode 100644 index 000000000..8c0868639 Binary files /dev/null and b/enjoy-docs/public/snapshots/audio-page.png differ diff --git a/enjoy-docs/public/snapshots/conversation-add-speech-to-audio.png b/enjoy-docs/public/snapshots/conversation-add-speech-to-audio.png new file mode 100644 index 000000000..4e520a426 Binary files /dev/null and b/enjoy-docs/public/snapshots/conversation-add-speech-to-audio.png differ diff --git a/enjoy-docs/public/snapshots/conversation-form.png b/enjoy-docs/public/snapshots/conversation-form.png new file mode 100644 index 000000000..969da03eb Binary files /dev/null and b/enjoy-docs/public/snapshots/conversation-form.png differ diff --git a/enjoy-docs/public/snapshots/english-coach-gpt-conversation.png b/enjoy-docs/public/snapshots/english-coach-gpt-conversation.png new file mode 100644 index 000000000..641cc26a8 Binary files /dev/null and b/enjoy-docs/public/snapshots/english-coach-gpt-conversation.png differ diff --git a/enjoy-docs/public/snapshots/logo.png b/enjoy-docs/public/snapshots/logo.png new file mode 100644 index 000000000..f024d53a1 Binary files /dev/null and b/enjoy-docs/public/snapshots/logo.png differ diff --git a/enjoy-docs/public/snapshots/pronouce-assessment.png b/enjoy-docs/public/snapshots/pronouce-assessment.png new file mode 100644 index 000000000..4449e0488 Binary files /dev/null and b/enjoy-docs/public/snapshots/pronouce-assessment.png differ diff --git a/enjoy-docs/public/snapshots/select-ai-role.png b/enjoy-docs/public/snapshots/select-ai-role.png new file mode 100644 index 000000000..a0d06a57c Binary files /dev/null and b/enjoy-docs/public/snapshots/select-ai-role.png differ diff --git a/enjoy-docs/public/snapshots/story-key-vocabulary.png b/enjoy-docs/public/snapshots/story-key-vocabulary.png new file mode 100644 index 000000000..2adae9997 Binary files /dev/null and b/enjoy-docs/public/snapshots/story-key-vocabulary.png differ diff --git a/enjoy-docs/public/snapshots/story-page.png b/enjoy-docs/public/snapshots/story-page.png new file mode 100644 index 000000000..cc669ab39 Binary files /dev/null and b/enjoy-docs/public/snapshots/story-page.png differ diff --git a/enjoy-docs/public/snapshots/video-page.png b/enjoy-docs/public/snapshots/video-page.png new file mode 100644 index 000000000..ca1aeb9d8 Binary files /dev/null and b/enjoy-docs/public/snapshots/video-page.png differ diff --git a/enjoy/forge.config.js b/enjoy/forge.config.js index d493083d5..3c1f93d0e 100644 --- a/enjoy/forge.config.js +++ b/enjoy/forge.config.js @@ -3,12 +3,17 @@ import { MakerZIP } from "@electron-forge/maker-zip"; import { MakerDeb } from "@electron-forge/maker-deb"; import { MakerRpm } from "@electron-forge/maker-rpm"; import { VitePlugin } from "@electron-forge/plugin-vite"; -import { FusesPlugin } from "@electron-forge/plugin-fuses"; -import { FuseV1Options, FuseVersion } from "@electron/fuses"; +import os from "os"; +// import { FusesPlugin } from "@electron-forge/plugin-fuses"; +// import { FuseV1Options, FuseVersion } from "@electron/fuses"; const config = { packagerConfig: { - asar: false, + asar: { + // Binary files won't work in asar, so we need to unpack them + unpackDir: + "{.vite/build/lib,.vite/build/samples,node_modules/ffmpeg-static,node_modules/@andrkrn/ffprobe-static}", + }, icon: "./assets/icon", name: "Enjoy", executableName: "enjoy", @@ -21,11 +26,17 @@ const config = { }, rebuildConfig: {}, makers: [ + { + name: "@electron-forge/maker-dmg", + config: { + icon: "./assets/icon.png", + }, + }, new MakerSquirrel({ name: "Enjoy", setupIcon: "./assets/icon.ico", }), - new MakerZIP({}, ["darwin", "win32"]), + new MakerZIP(["win32"]), new MakerDeb({ options: { name: "enjoy", @@ -51,6 +62,7 @@ const config = { owner: "xiaolai", name: "everyone-can-use-english", }, + generateReleaseNotes: true, draft: true, }, }, @@ -77,18 +89,44 @@ const config = { }, ], }), + { + name: "@electron-forge/plugin-auto-unpack-natives", + config: {}, + }, // Fuses are used to enable/disable various Electron functionality // at package time, before code signing the application - new FusesPlugin({ - version: FuseVersion.V1, - [FuseV1Options.RunAsNode]: false, - [FuseV1Options.EnableCookieEncryption]: true, - [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false, - [FuseV1Options.EnableNodeCliInspectArguments]: true, - [FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true, - [FuseV1Options.OnlyLoadAppFromAsar]: false, - }), + // new FusesPlugin({ + // version: FuseVersion.V1, + // [FuseV1Options.RunAsNode]: false, + // [FuseV1Options.EnableCookieEncryption]: true, + // [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false, + // [FuseV1Options.EnableNodeCliInspectArguments]: true, + // [FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true, + // [FuseV1Options.OnlyLoadAppFromAsar]: false, + // }), ], }; +const macOsCodesignConfig = { + osxSign: {}, + osxNotarize: { + tool: "notarytool", + appleId: process.env.APPLE_ID, + appleIdPassword: process.env.APPLE_APP_PASSWORD, + teamId: process.env.APPLE_TEAM_ID, + }, +}; + +if ( + os.platform() === "darwin" && + process.env.APPLE_ID && + process.env.APPLE_APP_PASSWORD && + process.env.APPLE_TEAM_ID +) { + config.packagerConfig = { + ...config.packagerConfig, + ...macOsCodesignConfig, + }; +} + export default config; diff --git a/enjoy/package.json b/enjoy/package.json index dd2cfaa64..f016c6c4e 100644 --- a/enjoy/package.json +++ b/enjoy/package.json @@ -30,6 +30,7 @@ "devDependencies": { "@electron-forge/cli": "^7.3.0", "@electron-forge/maker-deb": "^7.3.0", + "@electron-forge/maker-dmg": "^7.3.0", "@electron-forge/maker-rpm": "^7.3.0", "@electron-forge/maker-squirrel": "^7.3.0", "@electron-forge/maker-zip": "^7.3.0", @@ -38,7 +39,7 @@ "@electron-forge/plugin-vite": "^7.3.0", "@electron-forge/publisher-github": "^7.3.0", "@electron/fuses": "^1.7.0", - "@playwright/test": "^1.41.2", + "@playwright/test": "^1.42.0", "@tailwindcss/typography": "^0.5.10", "@types/autosize": "^4.0.3", "@types/command-exists": "^1.2.3", @@ -48,18 +49,18 @@ "@types/intl-tel-input": "^18.1.4", "@types/lodash": "^4.14.202", "@types/mark.js": "^8.11.12", - "@types/node": "^20.11.19", - "@types/react": "^18.2.57", + "@types/node": "^20.11.24", + "@types/react": "^18.2.61", "@types/react-dom": "^18.2.19", "@types/validator": "^13.11.9", "@types/wavesurfer.js": "^6.0.12", - "@typescript-eslint/eslint-plugin": "^7.0.2", - "@typescript-eslint/parser": "^7.0.2", + "@typescript-eslint/eslint-plugin": "^7.1.0", + "@typescript-eslint/parser": "^7.1.0", "@vitejs/plugin-react": "^4.2.1", "autoprefixer": "^10.4.17", - "electron": "^29.0.1", + "electron": "^29.1.0", "electron-playwright-helpers": "^1.7.1", - "eslint": "^8.56.0", + "eslint": "^8.57.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", "flora-colossus": "^2.0.0", @@ -106,7 +107,7 @@ "@radix-ui/react-toggle": "^1.0.3", "@radix-ui/react-tooltip": "^1.0.7", "@uidotdev/usehooks": "^2.4.1", - "@vidstack/react": "^1.10.9", + "@vidstack/react": "^0.6.14", "autosize": "^6.0.1", "axios": "^1.6.7", "camelcase": "^8.0.0", @@ -130,11 +131,11 @@ "html-to-text": "^9.0.5", "https-proxy-agent": "^7.0.4", "i18next": "^23.10.0", - "intl-tel-input": "^19.2.20", + "intl-tel-input": "^19.5.4", "js-md5": "^0.8.3", "langchain": "^0.1.21", "lodash": "^4.17.21", - "lucide-react": "^0.336.0", + "lucide-react": "^0.344.0", "mark.js": "^8.11.1", "microsoft-cognitiveservices-speech-sdk": "^1.35.0", "next-themes": "^0.2.1", @@ -149,13 +150,13 @@ "react-hotkeys-hook": "^4.5.0", "react-i18next": "^14.0.5", "react-markdown": "^9.0.1", - "react-router-dom": "^6.22.1", + "react-router-dom": "^6.22.2", "react-tooltip": "^5.26.3", "reflect-metadata": "^0.2.1", "rimraf": "^5.0.5", "sequelize": "^6.37.1", "sequelize-typescript": "^2.1.6", - "sonner": "^1.4.0", + "sonner": "^1.4.3", "sqlite3": "^5.1.7", "tailwind-scrollbar-hide": "^1.1.7", "umzug": "^3.7.0", diff --git a/enjoy/scripts/add-macos-cert.sh b/enjoy/scripts/add-macos-cert.sh new file mode 100755 index 000000000..0e44fafdc --- /dev/null +++ b/enjoy/scripts/add-macos-cert.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env sh + +KEY_CHAIN=build.keychain +CERTIFICATE_P12=certificate.p12 + +# Recreate the certificate from the secure environment variable +echo $MACOS_CERTIFICATE_APPLICATION_BASE64 | base64 --decode > $CERTIFICATE_P12 + +#create a keychain +security create-keychain -p actions $KEY_CHAIN + +# Make the keychain the default so identities are found +security default-keychain -s $KEY_CHAIN + +# Unlock the keychain +security unlock-keychain -p actions $KEY_CHAIN + +security import $CERTIFICATE_P12 -k $KEY_CHAIN -P $MACOS_CERTIFICATE_PASSWORD -T /usr/bin/codesign -T /usr/bin/productbuild; + +security set-key-partition-list -S apple-tool:,apple: -s -k actions $KEY_CHAIN + +# remove certs +rm -fr *.p12 diff --git a/enjoy/src/api/client.ts b/enjoy/src/api/client.ts index ec6763c33..cd7963976 100644 --- a/enjoy/src/api/client.ts +++ b/enjoy/src/api/client.ts @@ -297,4 +297,28 @@ export class Client { unstarStory(storyId: string): Promise<{ starred: boolean }> { return this.api.delete(`/api/mine/stories/${storyId}`); } + + createPayment(params: { + amount: number; + processor: string; + paymentType: string; + }): Promise { + return this.api.post("/api/payments", decamelizeKeys(params)); + } + + payments(params?: { + paymentType?: string; + page?: number; + items?: number; + }): Promise< + { + payments: PaymentType[]; + } & PagyResponseType + > { + return this.api.get("/api/payments", { params: decamelizeKeys(params) }); + } + + payment(id: string): Promise { + return this.api.get(`/api/payments/${id}`); + } } diff --git a/enjoy/src/commands/extract-story.command.ts b/enjoy/src/commands/extract-story.command.ts index 4ba2c2b06..66500fc78 100644 --- a/enjoy/src/commands/extract-story.command.ts +++ b/enjoy/src/commands/extract-story.command.ts @@ -2,6 +2,7 @@ import { ChatOpenAI } from "@langchain/openai"; import { ChatPromptTemplate } from "@langchain/core/prompts"; import { zodToJsonSchema } from "zod-to-json-schema"; import { z } from "zod"; +import { RESPONSE_JSON_FORMAT_MODELS } from "@/constants"; export const extractStoryCommand = async ( content: string, @@ -12,12 +13,12 @@ export const extractStoryCommand = async ( baseUrl?: string; } ): Promise<{ words: string[]; idioms: string[] }> => { - const { - key, - modelName = "gpt-3.5-turbo-1106", - temperature = 0, - baseUrl, - } = options; + const { key, temperature = 0, baseUrl } = options; + let { modelName = "gpt-4-turbo-preview" } = options; + + if (RESPONSE_JSON_FORMAT_MODELS.indexOf(modelName) === -1) { + modelName = "gpt-4-turbo-preview"; + } const saveExtraction = z.object({ words: z.array(z.string().describe("extracted word")), diff --git a/enjoy/src/commands/ipa.command.ts b/enjoy/src/commands/ipa.command.ts index f3d0b49ce..88987b9c2 100644 --- a/enjoy/src/commands/ipa.command.ts +++ b/enjoy/src/commands/ipa.command.ts @@ -5,6 +5,7 @@ import { StructuredOutputParser, OutputFixingParser, } from "langchain/output_parsers"; +import { RESPONSE_JSON_FORMAT_MODELS } from "@/constants"; export const ipaCommand = async ( text: string, @@ -15,12 +16,12 @@ export const ipaCommand = async ( baseUrl?: string; } ): Promise<{ words?: { word?: string; ipa?: string }[] }> => { - const { - key, - modelName = "gpt-3.5-turbo-1106", - temperature = 0, - baseUrl, - } = options; + const { key, temperature = 0, baseUrl } = options; + let { modelName = "gpt-4-turbo-preview" } = options; + + if (RESPONSE_JSON_FORMAT_MODELS.indexOf(modelName) === -1) { + modelName = "gpt-4-turbo-preview"; + } const responseSchema = z.object({ words: z.array( diff --git a/enjoy/src/commands/lookup.command.ts b/enjoy/src/commands/lookup.command.ts index 545f2b4f4..2e21a8641 100644 --- a/enjoy/src/commands/lookup.command.ts +++ b/enjoy/src/commands/lookup.command.ts @@ -5,6 +5,7 @@ import { StructuredOutputParser, OutputFixingParser, } from "langchain/output_parsers"; +import { RESPONSE_JSON_FORMAT_MODELS } from "@/constants"; export const lookupCommand = async ( params: { @@ -28,12 +29,13 @@ export const lookupCommand = async ( translation?: string; lemma?: string; }> => { - const { - key, - modelName = "gpt-3.5-turbo-1106", - temperature = 0, - baseUrl, - } = options; + const { key, temperature = 0, baseUrl } = options; + let { modelName = "gpt-4-turbo-preview" } = options; + + if (RESPONSE_JSON_FORMAT_MODELS.indexOf(modelName) === -1) { + modelName = "gpt-4-turbo-preview"; + } + const { word, context, meaningOptions } = params; const responseSchema = z.object({ diff --git a/enjoy/src/commands/translate.command.ts b/enjoy/src/commands/translate.command.ts index 13e16d815..3166b9a46 100644 --- a/enjoy/src/commands/translate.command.ts +++ b/enjoy/src/commands/translate.command.ts @@ -1,5 +1,6 @@ import { ChatOpenAI } from "@langchain/openai"; import { ChatPromptTemplate } from "@langchain/core/prompts"; +import { RESPONSE_JSON_FORMAT_MODELS } from "@/constants"; export const translateCommand = async ( text: string, @@ -10,12 +11,12 @@ export const translateCommand = async ( baseUrl?: string; } ): Promise => { - const { - key, - modelName = "gpt-3.5-turbo-1106", - temperature = 0, - baseUrl, - } = options; + const { key, temperature = 0, baseUrl } = options; + let { modelName = "gpt-4-turbo-preview" } = options; + + if (RESPONSE_JSON_FORMAT_MODELS.indexOf(modelName) === -1) { + modelName = "gpt-4-turbo-preview"; + } const chatModel = new ChatOpenAI({ openAIApiKey: key, diff --git a/enjoy/src/constants.ts b/enjoy/src/constants.ts index 7a78f4d36..324b44d08 100644 --- a/enjoy/src/constants.ts +++ b/enjoy/src/constants.ts @@ -96,3 +96,12 @@ export const PROCESS_TIMEOUT = 1000 * 60 * 15; export const AI_GATEWAY_ENDPOINT = "https://gateway.ai.cloudflare.com/v1/11d43ab275eb7e1b271ba4089ecc3864/enjoy"; + +export const RESPONSE_JSON_FORMAT_MODELS = [ + "gpt-3.5-turbo-0125", + "gpt-3.5-turbo", + "gpt-3.5-turbo-1106", + "gpt-4-0125-preview", + "gpt-4-turbo-preview", + "gpt-4-1106-preview", +]; diff --git a/enjoy/src/i18n/en.json b/enjoy/src/i18n/en.json index 78e1e6f1e..01504b394 100644 --- a/enjoy/src/i18n/en.json +++ b/enjoy/src/i18n/en.json @@ -309,6 +309,15 @@ "language": "Language", "balance": "Balance", "deposit": "Deposit", + "depositDescription": "Deposit to your account", + "depositDisclaimer": "After deposit, your balance is only used for paid services. It is not refundable.", + "pay": "Pay", + "pleaseCompletePaymentInPopupWindow": "Please complete payment in the popup window", + "processor": "Processor", + "amount": "Amount", + "date": "Date", + "status": "Status", + "recentDeposits": "Recent deposits", "notAvailableYet": "Not available yet", "whisperModel": "Whisper Model", "sttAiService": "STT AI service", diff --git a/enjoy/src/i18n/zh-CN.json b/enjoy/src/i18n/zh-CN.json index da86749e8..fb727cfd2 100644 --- a/enjoy/src/i18n/zh-CN.json +++ b/enjoy/src/i18n/zh-CN.json @@ -308,6 +308,15 @@ "language": "语言", "balance": "余额", "deposit": "充值", + "depositDescription": "充值至您的账户,用于购买付费服务", + "depositDisclaimer": "充值金额将直接存入您的账户,仅用于 App 内购买付费服务,不可退款", + "pay": "支付", + "pleaseCompletePaymentInPopupWindow": "请在弹出窗口中完成支付", + "processor": "渠道", + "amount": "金额", + "date": "日期", + "status": "状态", + "recentDeposits": "最近充值记录", "notAvailableYet": "暂未开放", "whisperModel": "Whisper 模型", "sttAiService": "语音转文本服务", diff --git a/enjoy/src/main/ffmpeg.ts b/enjoy/src/main/ffmpeg.ts index 8a8105cd2..22a04ba3e 100644 --- a/enjoy/src/main/ffmpeg.ts +++ b/enjoy/src/main/ffmpeg.ts @@ -6,13 +6,18 @@ import log from "@main/logger"; import path from "path"; import fs from "fs-extra"; import settings from "./settings"; -import url from 'url'; +import url from "url"; +/* + * ffmpeg and ffprobe bin file will be in /app.asar.unpacked instead of /app.asar + * the /samples folder is also in /app.asar.unpacked + */ +Ffmpeg.setFfmpegPath(ffmpegPath.replace("app.asar", "app.asar.unpacked")); +Ffmpeg.setFfprobePath(ffprobePath.replace("app.asar", "app.asar.unpacked")); const __filename = url.fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -Ffmpeg.setFfmpegPath(ffmpegPath); -Ffmpeg.setFfprobePath(ffprobePath); +const __dirname = path + .dirname(__filename) + .replace("app.asar", "app.asar.unpacked"); const logger = log.scope("ffmpeg"); export default class FfmpegWrapper { diff --git a/enjoy/src/main/whisper.ts b/enjoy/src/main/whisper.ts index 10b4bc87e..901457345 100644 --- a/enjoy/src/main/whisper.ts +++ b/enjoy/src/main/whisper.ts @@ -5,10 +5,15 @@ import { WHISPER_MODELS_OPTIONS, PROCESS_TIMEOUT } from "@/constants"; import { exec, spawn } from "child_process"; import fs from "fs-extra"; import log from "@main/logger"; -import url from 'url'; +import url from "url"; const __filename = url.fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); +/* + * whipser bin file will be in /app.asar.unpacked instead of /app.asar + */ +const __dirname = path + .dirname(__filename) + .replace("app.asar", "app.asar.unpacked"); const logger = log.scope("whisper"); diff --git a/enjoy/src/main/window.ts b/enjoy/src/main/window.ts index 15e16afd9..d08a354e5 100644 --- a/enjoy/src/main/window.ts +++ b/enjoy/src/main/window.ts @@ -20,7 +20,7 @@ import { WEB_API_URL, REPO_URL } from "@/constants"; import { AudibleProvider, TedProvider } from "@main/providers"; import Ffmpeg from "@main/ffmpeg"; import { Waveform } from "./waveform"; -import url from 'url'; +import url from "url"; const __filename = url.fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -442,14 +442,8 @@ ${log} }, }); - mainWindow.webContents.setWindowOpenHandler(({ url }) => { - if (url.startsWith("http")) { - logger.info(`Opening ${url}`); - shell.openExternal(url); - return { action: "deny" }; - } else { - return { action: "allow" }; - } + mainWindow.webContents.setWindowOpenHandler(() => { + return { action: "allow" }; }); // and load the index.html of the app. diff --git a/enjoy/src/renderer/components/conversations/conversation-form.tsx b/enjoy/src/renderer/components/conversations/conversation-form.tsx index 87078b197..0c00bfacd 100644 --- a/enjoy/src/renderer/components/conversations/conversation-form.tsx +++ b/enjoy/src/renderer/components/conversations/conversation-form.tsx @@ -731,10 +731,13 @@ export const LLM_PROVIDERS: { [key: string]: any } = { enjoyai: { name: "EnjoyAI", models: [ - "gpt-3.5-turbo-1106", + "gpt-3.5-turbo-0125", "gpt-3.5-turbo", + "gpt-3.5-turbo-1106", "gpt-3.5-turbo-16k", "gpt-3.5-turbo-instruct", + "gpt-4-0125-preview", + "gpt-4-turbo-preview", "gpt-4-1106-preview", "gpt-4-vision-preview", "gpt-4", @@ -759,10 +762,13 @@ export const LLM_PROVIDERS: { [key: string]: any } = { name: "OpenAI", description: t("youNeedToSetupApiKeyBeforeUsingOpenAI"), models: [ - "gpt-3.5-turbo-1106", + "gpt-3.5-turbo-0125", "gpt-3.5-turbo", + "gpt-3.5-turbo-1106", "gpt-3.5-turbo-16k", "gpt-3.5-turbo-instruct", + "gpt-4-0125-preview", + "gpt-4-turbo-preview", "gpt-4-1106-preview", "gpt-4-vision-preview", "gpt-4", @@ -820,14 +826,14 @@ export const LLM_PROVIDERS: { [key: string]: any } = { export const TTS_PROVIDERS: { [key: string]: any } = { enjoyai: { name: "EnjoyAI", - models: ["tts-1"], + models: ["tts-1", "tts-1-hd"], voices: ["alloy", "echo", "fable", "onyx", "nova", "shimmer"], configurable: ["voice"], }, openai: { name: "OpenAI", description: t("youNeedToSetupApiKeyBeforeUsingOpenAI"), - models: ["tts-1"], + models: ["tts-1", "tts-1-hd"], voices: ["alloy", "echo", "fable", "onyx", "nova", "shimmer"], configurable: ["model", "voice", "baseUrl"], }, diff --git a/enjoy/src/renderer/components/preferences/balance-settings.tsx b/enjoy/src/renderer/components/preferences/balance-settings.tsx index cb0c060ae..3f2f4933f 100644 --- a/enjoy/src/renderer/components/preferences/balance-settings.tsx +++ b/enjoy/src/renderer/components/preferences/balance-settings.tsx @@ -1,16 +1,82 @@ import { t } from "i18next"; import { AppSettingsProviderContext } from "@renderer/context"; import { useContext, useState, useEffect } from "react"; -import { Button } from "@renderer/components/ui"; +import { + Button, + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, + DialogClose, + Table, + TableBody, + TableCaption, + TableCell, + TableHead, + TableHeader, + TableRow, + toast, +} from "@renderer/components/ui"; +import { LoaderSpin } from "@renderer/components"; +import { LoaderIcon } from "lucide-react"; +import { formatDateTime } from "@/renderer/lib/utils"; export const BalanceSettings = () => { - const { webApi } = useContext(AppSettingsProviderContext); + const { webApi, user } = useContext(AppSettingsProviderContext); const [balance, setBalance] = useState(0); + const [depositAmount, setDepositAmount] = useState(1); + const [loading, setLoading] = useState(false); + const [paymentCreated, setPaymentCreated] = useState(false); + const [payments, setPayments] = useState([]); - useEffect(() => { + const refreshPayments = () => { + webApi + .payments({ + paymentType: "deposit", + }) + .then(({ payments }) => { + setPayments(payments); + }) + .catch((error) => { + toast.error(error.message); + }); + }; + + const refreshBalance = () => { webApi.me().then((user) => { setBalance(user.balance); }); + }; + + const createDepositPayment = (processor = "stripe") => { + if (loading) return; + + setLoading(true); + webApi + .createPayment({ + amount: depositAmount, + paymentType: "deposit", + processor, + }) + .then((payment) => { + if (payment?.payUrl) { + setPaymentCreated(true); + window.open(payment.payUrl, "model"); + } + }) + .catch((error) => { + toast.error(error.message); + }) + .finally(() => { + setLoading(false); + }); + }; + + useEffect(() => { + refreshBalance(); }, []); if (!balance) return null; @@ -20,15 +86,134 @@ export const BalanceSettings = () => {
{t("balance")}
${balance}
- + + + + + + + {t("deposit")} + {t("depositDescription")} + + + {paymentCreated ? ( + <> + +
+ {t("pleaseCompletePaymentInPopupWindow")} +
+ + ) : ( + <> +
+ {[1, 2, 5, 10].map((amount) => ( +
setDepositAmount(amount)} + > + ${amount} +
+ ))} +
+
{t("depositDisclaimer")}
+ + )} + + + + + + {paymentCreated ? null : ( + <> + {user.hasMixin && ( + + )} + + + )} + + + {payments.length > 0 && ( +
+ + {t("recentDeposits")} + + + ID + {t("amount")} + {t("status")} + + {t("processor")} + + {t("date")} + + + + {payments.map((payment) => ( + + + + {payment.id.split("-").shift()} + + + ${payment.amount} + {payment.status} + + {payment.processor} + + + {formatDateTime(payment.createdAt)} + + + ))} + +
+
+ )} +
+ ); }; diff --git a/enjoy/src/renderer/context/app-settings-provider.tsx b/enjoy/src/renderer/context/app-settings-provider.tsx index 2299509e2..ff42cff99 100644 --- a/enjoy/src/renderer/context/app-settings-provider.tsx +++ b/enjoy/src/renderer/context/app-settings-provider.tsx @@ -79,12 +79,15 @@ export const AppSettingsProvider = ({ }, [user, apiUrl, language]); const prepareFfmpeg = async () => { - const valid = await EnjoyApp.ffmpeg.check(); - setFfmpegValid(valid); - - if (!valid) { - loadFfmpegWASM(); + try { + const valid = await EnjoyApp.ffmpeg.check(); + setFfmpegValid(valid); + } catch (err) { + console.error(err); + toast.error(err.message); } + + loadFfmpegWASM(); }; const loadFfmpegWASM = async () => { @@ -113,6 +116,7 @@ export const AppSettingsProvider = ({ workerURL, }); setFfmpegWasm(ffmpegRef.current); + (window as any).ffmpeg = ffmpegRef.current; } catch (err) { toast.error(err.message); } @@ -150,7 +154,7 @@ export const AppSettingsProvider = ({ client.me().then((user) => { if (user?.id) { - login(currentUser); + login(Object.assign({}, currentUser, user)); } else { logout(); } diff --git a/enjoy/src/renderer/pages/conversations.tsx b/enjoy/src/renderer/pages/conversations.tsx index 18fbe5d62..a5c8aca68 100644 --- a/enjoy/src/renderer/pages/conversations.tsx +++ b/enjoy/src/renderer/pages/conversations.tsx @@ -67,7 +67,7 @@ export default () => { engine: currentEngine.name, configuration: { type: "gpt", - model: "gpt-4-1106-preview", + model: "gpt-4-turbo-preview", baseUrl: "", roleDefinition: `你是我的英语教练。 请将我的话改写成英文。 @@ -110,7 +110,7 @@ export default () => { engine: currentEngine.name, configuration: { type: "gpt", - model: "gpt-4-1106-preview", + model: "gpt-4-turbo-preview", baseUrl: "", roleDefinition: "", temperature: 0.2, diff --git a/enjoy/src/types/payment.d.ts b/enjoy/src/types/payment.d.ts new file mode 100644 index 000000000..771efc577 --- /dev/null +++ b/enjoy/src/types/payment.d.ts @@ -0,0 +1,14 @@ +type PaymentType = { + id: string; + amount: number; + status: 'succeeded' | 'expired' | 'pending'; + paymentType: string; + processor: string; + traceId?: string; + snapshotId?: string; + memo?: string; + payUrl?: string; + receiptUrl?: string; + createdAt: string; + updatedAt: string; +} diff --git a/enjoy/src/types/user.d.ts b/enjoy/src/types/user.d.ts index d0a71fb95..4ebca7d81 100644 --- a/enjoy/src/types/user.d.ts +++ b/enjoy/src/types/user.d.ts @@ -6,5 +6,6 @@ type UserType = { accessToken?: string; recordingsCount?: number; recordingsDuration?: number; + hasMixin?: boolean; createdAt?: string; }; diff --git a/enjoy/tsconfig.json b/enjoy/tsconfig.json index 96e6d21b7..138d38670 100644 --- a/enjoy/tsconfig.json +++ b/enjoy/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ESNext", - "module": "commonjs", + "module": "ESNext", "allowJs": true, "skipLibCheck": true, "esModuleInterop": true, diff --git a/package.json b/package.json index c0579536a..9db33611a 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,25 @@ { "private": true, "workspaces": [ - "enjoy" + "enjoy", + "enjoy-docs" ], "scripts": { - "dev:enjoy": "yarn workspace enjoy dev", - "start:enjoy": "yarn workspace enjoy start", - "test:enjoy": "yarn workspace enjoy test", - "package:enjoy": "yarn workspace enjoy package", - "make:enjoy": "yarn workspace enjoy make", - "publish:enjoy": "yarn workspace enjoy publish", - "lint:enjoy": "yarn workspace enjoy eslint --ext .ts,.tsx .", - "create-migration:enjoy": "yarn workspace enjoy zx ./src/main/db/create-migration.mjs", - "dev:1000h": "yarn workspace 1000-hours dev", - "build:1000h": "yarn workspace 1000-hours build", - "preview:1000h": "yarn workspace 1000-hours preview" + "start:enjoy": "echo 'Please use `yarn enjoy:start` instead'", + "enjoy:dev": "yarn workspace enjoy dev", + "enjoy:start": "yarn workspace enjoy start", + "enjoy:test": "yarn workspace enjoy test", + "enjoy:package": "yarn workspace enjoy package", + "enjoy:make": "yarn workspace enjoy make", + "enjoy:publish": "yarn workspace enjoy publish", + "enjoy:lint": "yarn workspace enjoy eslint --ext .ts,.tsx .", + "enjoy:create-migration": "yarn workspace enjoy zx ./src/main/db/create-migration.mjs", + "docs:dev": "yarn workspace enjoy-docs dev", + "docs:build": "yarn workspace enjoy-docs build", + "docs:preview": "yarn workspace enjoy-docs preview", + "1000h:dev": "yarn workspace 1000-hours dev", + "1000h:build": "yarn workspace 1000-hours build", + "1000h:preview": "yarn workspace 1000-hours preview" }, "packageManager": "yarn@4.1.0", "engines": { diff --git a/yarn.lock b/yarn.lock index 2efaa1660..aefa02b78 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,6 +12,181 @@ __metadata: languageName: node linkType: hard +"@algolia/autocomplete-core@npm:1.9.3": + version: 1.9.3 + resolution: "@algolia/autocomplete-core@npm:1.9.3" + dependencies: + "@algolia/autocomplete-plugin-algolia-insights": "npm:1.9.3" + "@algolia/autocomplete-shared": "npm:1.9.3" + checksum: 10c0/a751b20f15c9a30b8b2d5a4f1f62fb4dbd012fb7ffec1b12308d6e7388b5a4dc83af52176634f17facb57a7727204843c5aa2f6e80efafaaf244275f44af11d9 + languageName: node + linkType: hard + +"@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3": + version: 1.9.3 + resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3" + dependencies: + "@algolia/autocomplete-shared": "npm:1.9.3" + peerDependencies: + search-insights: ">= 1 < 3" + checksum: 10c0/574196f66fe828be1029439032376685020524d6c729dea99caef336cc7be244d2539fa91b3fe80db80efe3420c2c05063cab3534514be6c637bf1914b17a6f6 + languageName: node + linkType: hard + +"@algolia/autocomplete-preset-algolia@npm:1.9.3": + version: 1.9.3 + resolution: "@algolia/autocomplete-preset-algolia@npm:1.9.3" + dependencies: + "@algolia/autocomplete-shared": "npm:1.9.3" + peerDependencies: + "@algolia/client-search": ">= 4.9.1 < 6" + algoliasearch: ">= 4.9.1 < 6" + checksum: 10c0/38c1872db4dae69b4eec622db940c7a992d8530e33fbac7df593473ef404312076d9933b4a7ea25c2d401ea5b62ebd64b56aa25b5cdd8e8ba3fd309a39d9d816 + languageName: node + linkType: hard + +"@algolia/autocomplete-shared@npm:1.9.3": + version: 1.9.3 + resolution: "@algolia/autocomplete-shared@npm:1.9.3" + peerDependencies: + "@algolia/client-search": ">= 4.9.1 < 6" + algoliasearch: ">= 4.9.1 < 6" + checksum: 10c0/1aa926532c32be6bb5384c8c0ae51a312c9d79ed7486371218dfcb61c8ea1ed46171bdc9f9b596a266aece104a0ef76d6aac2f9a378a5a6eb4460e638d59f6ae + languageName: node + linkType: hard + +"@algolia/cache-browser-local-storage@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/cache-browser-local-storage@npm:4.22.1" + dependencies: + "@algolia/cache-common": "npm:4.22.1" + checksum: 10c0/18dfe05cab0a369ce67d165b748c6bfac74b17621e1bd27618756136ebf517eeab836ffaedbeff55ef28cd13eaeee52b296f681a9af8f7c41db2f37b1e1b0073 + languageName: node + linkType: hard + +"@algolia/cache-common@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/cache-common@npm:4.22.1" + checksum: 10c0/3b1ed5694c38e6f0018914cd4151198804f76780bda8364d1a4b68658ba19f56a3bc92633569604cb3a11ab01246abddde44885a9fa40bc8aebc2e227e6a91f8 + languageName: node + linkType: hard + +"@algolia/cache-in-memory@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/cache-in-memory@npm:4.22.1" + dependencies: + "@algolia/cache-common": "npm:4.22.1" + checksum: 10c0/cd66ffcbb754553da405a418e7eceb8fc25ea8dcd9f7cb9886711f45b5d00aa57b949135e997a6c3cf4082423a18ce1abd4f1c097bdffa3289883e92cb6112be + languageName: node + linkType: hard + +"@algolia/client-account@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/client-account@npm:4.22.1" + dependencies: + "@algolia/client-common": "npm:4.22.1" + "@algolia/client-search": "npm:4.22.1" + "@algolia/transporter": "npm:4.22.1" + checksum: 10c0/8aabe87fd8bf72732ba3c7158e59d1e10215a72cd62ab6604923598544bd4321b3823a2b3fbef82f0c981659a97092d8d5f108014e4f6963e1be7bed5819f755 + languageName: node + linkType: hard + +"@algolia/client-analytics@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/client-analytics@npm:4.22.1" + dependencies: + "@algolia/client-common": "npm:4.22.1" + "@algolia/client-search": "npm:4.22.1" + "@algolia/requester-common": "npm:4.22.1" + "@algolia/transporter": "npm:4.22.1" + checksum: 10c0/aacb649b1f6ee9604c9c22684f56a2810bfd987845190caa1c40287ea35150654584f2b51660b3e77fbb729a95a99f7e3a29a9c1e82dadb7ae0fec00c7c305d7 + languageName: node + linkType: hard + +"@algolia/client-common@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/client-common@npm:4.22.1" + dependencies: + "@algolia/requester-common": "npm:4.22.1" + "@algolia/transporter": "npm:4.22.1" + checksum: 10c0/39a3b57178a8a100f766758fad4845d6684c7b93a4df4409a4829e367d9249c5e95d5e5c5cf56b6058b3ea1779b132235619f0458641a47f52d9a886bd54c2a8 + languageName: node + linkType: hard + +"@algolia/client-personalization@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/client-personalization@npm:4.22.1" + dependencies: + "@algolia/client-common": "npm:4.22.1" + "@algolia/requester-common": "npm:4.22.1" + "@algolia/transporter": "npm:4.22.1" + checksum: 10c0/a5d37f3ce695d05ce0b280db94d59c00848161ffb96b8876844dc4dffce2319e3f71faa816b6514c77e3c34e37d575d88422b96392088d82fd625ca0bb2e9cf3 + languageName: node + linkType: hard + +"@algolia/client-search@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/client-search@npm:4.22.1" + dependencies: + "@algolia/client-common": "npm:4.22.1" + "@algolia/requester-common": "npm:4.22.1" + "@algolia/transporter": "npm:4.22.1" + checksum: 10c0/2d6bf304d7b5329b1940a4fda3ada89bc65d8528110cb06d33831af165a515da82f847f28d97b099c18b728fa3fc88e2850c048f4dcc7f2226b476984f2b69b4 + languageName: node + linkType: hard + +"@algolia/logger-common@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/logger-common@npm:4.22.1" + checksum: 10c0/66fcfa90d3e94fe582f6a7ded8f413689f25c8c8c3c420f40cccd7acc7e7bc7895b1c5191e2c371e81d31a8dfc5dc8d0e7c9995a57635f1afb833f665c8dfb7c + languageName: node + linkType: hard + +"@algolia/logger-console@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/logger-console@npm:4.22.1" + dependencies: + "@algolia/logger-common": "npm:4.22.1" + checksum: 10c0/b93522a3c699537805b347028f7a46af0860ce6ca5fd4bfee717f01cbd1341b04b48441cfb96e1582a35a3382029fb8ae2448efc6a750a703ef1dbb577011c5a + languageName: node + linkType: hard + +"@algolia/requester-browser-xhr@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/requester-browser-xhr@npm:4.22.1" + dependencies: + "@algolia/requester-common": "npm:4.22.1" + checksum: 10c0/bae3555e5660582e7e2b2fe6a637591ddb89e2b463a295fd541e01e8b1eb5c05d7efb00cdc231f8615e408dfd64f078b4bfcf6ca8c0b1c99bfc6d2fd05530f9a + languageName: node + linkType: hard + +"@algolia/requester-common@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/requester-common@npm:4.22.1" + checksum: 10c0/e0c61fd4515e30163ace99528212e50478ece175f96186f9b7d4f79406a70f78e98a4fb09f929f178f2a3e193257f749fdcd7acc44dd41d875d073172f4a2d8b + languageName: node + linkType: hard + +"@algolia/requester-node-http@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/requester-node-http@npm:4.22.1" + dependencies: + "@algolia/requester-common": "npm:4.22.1" + checksum: 10c0/ca934a1ae6b6b2f5bd78df9c88e133461eb67a8394cc5764d7a8f430cd7a6f069f55a9a4f26c4aed9bed76c4aa1edfce4727feeaec4a86d672a0ade3b1be1846 + languageName: node + linkType: hard + +"@algolia/transporter@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/transporter@npm:4.22.1" + dependencies: + "@algolia/cache-common": "npm:4.22.1" + "@algolia/logger-common": "npm:4.22.1" + "@algolia/requester-common": "npm:4.22.1" + checksum: 10c0/e43c4258100cfe8dddab7a77d2beb3161d01b570358f4e24357761afcfa1cac480cc183ff71f6c6399019c3652d822edecf74483406188712025e897d193c380 + languageName: node + linkType: hard + "@alloc/quick-lru@npm:^5.2.0": version: 5.2.0 resolution: "@alloc/quick-lru@npm:5.2.0" @@ -20,12 +195,12 @@ __metadata: linkType: hard "@ampproject/remapping@npm:^2.2.0": - version: 2.2.1 - resolution: "@ampproject/remapping@npm:2.2.1" + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.0" - "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: 10c0/92ce5915f8901d8c7cd4f4e6e2fe7b9fd335a29955b400caa52e0e5b12ca3796ada7c2f10e78c9c5b0f9c2539dff0ffea7b19850a56e1487aa083531e1e46d43 + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed languageName: node linkType: hard @@ -76,25 +251,25 @@ __metadata: linkType: hard "@babel/core@npm:^7.23.5": - version: 7.23.9 - resolution: "@babel/core@npm:7.23.9" + version: 7.24.0 + resolution: "@babel/core@npm:7.24.0" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.23.5" "@babel/generator": "npm:^7.23.6" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.23.9" - "@babel/parser": "npm:^7.23.9" - "@babel/template": "npm:^7.23.9" - "@babel/traverse": "npm:^7.23.9" - "@babel/types": "npm:^7.23.9" + "@babel/helpers": "npm:^7.24.0" + "@babel/parser": "npm:^7.24.0" + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.0" + "@babel/types": "npm:^7.24.0" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/03883300bf1252ab4c9ba5b52f161232dd52873dbe5cde9289bb2bb26e935c42682493acbac9194a59a3b6cbd17f4c4c84030db8d6d482588afe64531532ff9b + checksum: 10c0/bb37cbf0bdfd676b246af0a3d9a7932d10573f2d45114fdda02a71889e35530ce13d8930177e78b065d6734b8d45a4fbf7c77f223b1d44b4a28cfe5fefee93ed languageName: node linkType: hard @@ -174,9 +349,9 @@ __metadata: linkType: hard "@babel/helper-plugin-utils@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-plugin-utils@npm:7.22.5" - checksum: 10c0/d2c4bfe2fa91058bcdee4f4e57a3f4933aed7af843acfd169cd6179fab8d13c1d636474ecabb2af107dc77462c7e893199aa26632bac1c6d7e025a17cbb9d20d + version: 7.24.0 + resolution: "@babel/helper-plugin-utils@npm:7.24.0" + checksum: 10c0/90f41bd1b4dfe7226b1d33a4bb745844c5c63e400f9e4e8bf9103a7ceddd7d425d65333b564d9daba3cebd105985764d51b4bd4c95822b97c2e3ac1201a8a5da languageName: node linkType: hard @@ -219,14 +394,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/helpers@npm:7.23.9" +"@babel/helpers@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/helpers@npm:7.24.0" dependencies: - "@babel/template": "npm:^7.23.9" - "@babel/traverse": "npm:^7.23.9" - "@babel/types": "npm:^7.23.9" - checksum: 10c0/f69fd0aca96a6fb8bd6dd044cd8a5c0f1851072d4ce23355345b9493c4032e76d1217f86b70df795e127553cf7f3fcd1587ede9d1b03b95e8b62681ca2165b87 + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.0" + "@babel/types": "npm:^7.24.0" + checksum: 10c0/dd27c9f11c1c5244ef312fae37636f2fcc69c541c46508017b846c4cf680af059f1922ce84e3f778f123a70d027ded75c96070ee8e906f3bc52dc26dc43df608 languageName: node linkType: hard @@ -241,12 +416,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/parser@npm:7.23.9" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/parser@npm:7.24.0" bin: parser: ./bin/babel-parser.js - checksum: 10c0/7df97386431366d4810538db4b9ec538f4377096f720c0591c7587a16f6810e62747e9fbbfa1ff99257fd4330035e4fb1b5b77c7bd3b97ce0d2e3780a6618975 + checksum: 10c0/77593d0b9de9906823c4d653bb6cda1c7593837598516330f655f70cba6224a37def7dbe5b4dad0038482d407d8d209eb8be5f48ca9a13357d769f829c5adb8e languageName: node linkType: hard @@ -273,28 +448,28 @@ __metadata: 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": - version: 7.23.9 - resolution: "@babel/runtime@npm:7.23.9" + version: 7.24.0 + resolution: "@babel/runtime@npm:7.24.0" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/e71205fdd7082b2656512cc98e647d9ea7e222e4fe5c36e9e5adc026446fcc3ba7b3cdff8b0b694a0b78bb85db83e7b1e3d4c56ef90726682b74f13249cf952d + checksum: 10c0/3495eed727bf4a4f84c35bb51ab53317ae38f4bbc3b1d0a8303751f9dfa0ce6f5fb2afced72b76c3dd0d8bb2ccb84787559a4dee9886291a36b26f02f0f759b4 languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/template@npm:7.23.9" +"@babel/template@npm:^7.22.15, @babel/template@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/template@npm:7.24.0" dependencies: "@babel/code-frame": "npm:^7.23.5" - "@babel/parser": "npm:^7.23.9" - "@babel/types": "npm:^7.23.9" - checksum: 10c0/0e8b60119433787742bc08ae762bbd8d6755611c4cabbcb7627b292ec901a55af65d93d1c88572326069efb64136ef151ec91ffb74b2df7689bbab237030833a + "@babel/parser": "npm:^7.24.0" + "@babel/types": "npm:^7.24.0" + checksum: 10c0/9d3dd8d22fe1c36bc3bdef6118af1f4b030aaf6d7d2619f5da203efa818a2185d717523486c111de8d99a8649ddf4bbf6b2a7a64962d8411cf6a8fa89f010e54 languageName: node linkType: hard -"@babel/traverse@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/traverse@npm:7.23.9" +"@babel/traverse@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/traverse@npm:7.24.0" dependencies: "@babel/code-frame": "npm:^7.23.5" "@babel/generator": "npm:^7.23.6" @@ -302,22 +477,22 @@ __metadata: "@babel/helper-function-name": "npm:^7.23.0" "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.23.9" - "@babel/types": "npm:^7.23.9" + "@babel/parser": "npm:^7.24.0" + "@babel/types": "npm:^7.24.0" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/d1615d1d02f04d47111a7ea4446a1a6275668ca39082f31d51f08380de9502e19862be434eaa34b022ce9a17dbb8f9e2b73a746c654d9575f3a680a7ffdf5630 + checksum: 10c0/55ffd2b0ce0fbd0a09051edc4def4fb1e96f35e0b100c0dc2a7429df569971ae312c290e980e423471f350961705698a257c7eea8c8304918024cc26f02468ba languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.23.9, @babel/types@npm:^7.8.3": - version: 7.23.9 - resolution: "@babel/types@npm:7.23.9" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.24.0, @babel/types@npm:^7.8.3": + version: 7.24.0 + resolution: "@babel/types@npm:7.24.0" dependencies: "@babel/helper-string-parser": "npm:^7.23.4" "@babel/helper-validator-identifier": "npm:^7.22.20" to-fast-properties: "npm:^2.0.0" - checksum: 10c0/edc7bb180ce7e4d2aea10c6972fb10474341ac39ba8fdc4a27ffb328368dfdfbf40fca18e441bbe7c483774500d5c05e222cec276c242e952853dcaf4eb884f7 + checksum: 10c0/777a0bb5dbe038ca4c905fdafb1cdb6bdd10fe9d63ce13eca0bd91909363cbad554a53dc1f902004b78c1dcbc742056f877f2c99eeedff647333b1fadf51235d languageName: node linkType: hard @@ -342,6 +517,49 @@ __metadata: languageName: node linkType: hard +"@docsearch/css@npm:3.5.2, @docsearch/css@npm:^3.5.2": + version: 3.5.2 + resolution: "@docsearch/css@npm:3.5.2" + checksum: 10c0/736e029b65dba3b2fafb98b4bc4e6f7f411863fed4ef2798c82be8dcdcbdcb9dea6a75376b19d013e9d2f8607b2e3f8d8353938343b08b382894d8b16883ccb3 + languageName: node + linkType: hard + +"@docsearch/js@npm:^3.5.2": + version: 3.5.2 + resolution: "@docsearch/js@npm:3.5.2" + dependencies: + "@docsearch/react": "npm:3.5.2" + preact: "npm:^10.0.0" + checksum: 10c0/4aac8b0a9d28ec216eda1f65f00f37bcdcde1c1d2b00e81542d7865e712dfba3a7d83132f597684569e36fb143c24d3ed5d5fdddc4d36c17cf3f07f6b047504a + languageName: node + linkType: hard + +"@docsearch/react@npm:3.5.2": + version: 3.5.2 + resolution: "@docsearch/react@npm:3.5.2" + dependencies: + "@algolia/autocomplete-core": "npm:1.9.3" + "@algolia/autocomplete-preset-algolia": "npm:1.9.3" + "@docsearch/css": "npm:3.5.2" + algoliasearch: "npm:^4.19.1" + peerDependencies: + "@types/react": ">= 16.8.0 < 19.0.0" + react: ">= 16.8.0 < 19.0.0" + react-dom: ">= 16.8.0 < 19.0.0" + search-insights: ">= 1 < 3" + peerDependenciesMeta: + "@types/react": + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + checksum: 10c0/1dc22a4364be89bc4139bbcc4c90ea240a701961eb698101f53067fd6e0ca014fc12bb6577b67dc108e0ef5e8484866df8e08eb681f9bcafc898a822ce2f42d8 + languageName: node + linkType: hard + "@electron-forge/cli@npm:^7.3.0": version: 7.3.0 resolution: "@electron-forge/cli@npm:7.3.0" @@ -449,6 +667,21 @@ __metadata: languageName: node linkType: hard +"@electron-forge/maker-dmg@npm:^7.3.0": + version: 7.3.0 + resolution: "@electron-forge/maker-dmg@npm:7.3.0" + dependencies: + "@electron-forge/maker-base": "npm:7.3.0" + "@electron-forge/shared-types": "npm:7.3.0" + electron-installer-dmg: "npm:^4.0.0" + fs-extra: "npm:^10.0.0" + dependenciesMeta: + electron-installer-dmg: + optional: true + checksum: 10c0/10025842de677d1ae563d0eee17af85cff2aeb166780780e78274d54585e6098c452365a0b72e8fd08b363906f865e62dfaf9592b65ccf263de6627a76ab50c0 + languageName: node + linkType: hard + "@electron-forge/maker-rpm@npm:^7.3.0": version: 7.3.0 resolution: "@electron-forge/maker-rpm@npm:7.3.0" @@ -816,8 +1049,8 @@ __metadata: linkType: hard "@electron/windows-sign@npm:^1.0.0": - version: 1.1.1 - resolution: "@electron/windows-sign@npm:1.1.1" + version: 1.1.2 + resolution: "@electron/windows-sign@npm:1.1.2" dependencies: cross-dirname: "npm:^0.1.0" debug: "npm:^4.3.4" @@ -826,7 +1059,7 @@ __metadata: postject: "npm:^1.0.0-alpha.6" bin: electron-windows-sign: bin/electron-windows-sign.js - checksum: 10c0/e40bd8c0116bcec8ca4093236636c34d240879959181692499b9361c2745e2f7cda28439d622f12fdaf1c620e0477c831be9059dd10c23c2244ead86cc2e129b + checksum: 10c0/eb8dd7e4908b67b5893e53a70a079fd8717feb1895682cad0c1aabe174bb4f1a1441f75945452e8c7622552e18623e2f468114a2bc06c225c5a08bd599169e60 languageName: node linkType: hard @@ -1026,10 +1259,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.56.0": - version: 8.56.0 - resolution: "@eslint/js@npm:8.56.0" - checksum: 10c0/60b3a1cf240e2479cec9742424224465dc50e46d781da1b7f5ef240501b2d1202c225bd456207faac4b34a64f4765833345bc4ddffd00395e1db40fa8c426f5a +"@eslint/js@npm:8.57.0": + version: 8.57.0 + resolution: "@eslint/js@npm:8.57.0" + checksum: 10c0/9a518bb8625ba3350613903a6d8c622352ab0c6557a59fe6ff6178bf882bf57123f9d92aa826ee8ac3ee74b9c6203fe630e9ee00efb03d753962dcf65ee4bd94 languageName: node linkType: hard @@ -1117,7 +1350,7 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.13": +"@humanwhocodes/config-array@npm:^0.11.14": version: 0.11.14 resolution: "@humanwhocodes/config-array@npm:0.11.14" dependencies: @@ -1156,14 +1389,14 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.3 - resolution: "@jridgewell/gen-mapping@npm:0.3.3" +"@jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" dependencies: - "@jridgewell/set-array": "npm:^1.0.1" + "@jridgewell/set-array": "npm:^1.2.1" "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: 10c0/376fc11cf5a967318ba3ddd9d8e91be528eab6af66810a713c49b0c3f8dc67e9949452c51c38ab1b19aa618fb5e8594da5a249977e26b1e7fea1ee5a1fcacc74 + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb languageName: node linkType: hard @@ -1174,14 +1407,14 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 10c0/bc7ab4c4c00470de4e7562ecac3c0c84f53e7ee8a711e546d67c47da7febe7c45cd67d4d84ee3c9b2c05ae8e872656cdded8a707a283d30bd54fbc65aef821ab +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": version: 1.4.15 resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" checksum: 10c0/0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5 @@ -1198,21 +1431,289 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.22 - resolution: "@jridgewell/trace-mapping@npm:0.3.22" +"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.24": + version: 0.3.24 + resolution: "@jridgewell/trace-mapping@npm:0.3.24" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/18cf19f88e2792c1c91515f2b629aae05f3cdbb2e60c3886e16e80725234ce26dd10144c4981c05d9366e7094498c0b4fe5c1a89f4a730d7376a4ba4af448149 + checksum: 10c0/5d6656c439f67cee8bc196a72ceebc446c23924dba6c67806fd3dfefb3ef4c8b2168ea44a0293d8c33c71b88e60862e0397576ef8707e4321e64898fec7a0189 + languageName: node + linkType: hard + +"@langchain/community@npm:^0.0.32": + version: 0.0.32 + resolution: "@langchain/community@npm:0.0.32" + dependencies: + "@langchain/core": "npm:~0.1.32" + "@langchain/openai": "npm:~0.0.14" + 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 + 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: "*" + 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 + 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 + 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/b0afd1052188d435c0189b6777ed323efa33cfda7485ca9b79e2dfbcfe3f792eb9d7b1ed3ea5a999c68b5db79563d1212cb22f60429d15a6df3ab1fd5ca0eeb2 languageName: node linkType: hard -"@langchain/community@npm:^0.0.32, @langchain/community@npm:~0.0.32": - version: 0.0.32 - resolution: "@langchain/community@npm:0.0.32" +"@langchain/community@npm:~0.0.33": + version: 0.0.34 + resolution: "@langchain/community@npm:0.0.34" dependencies: - "@langchain/core": "npm:~0.1.32" + "@langchain/core": "npm:~0.1.36" "@langchain/openai": "npm:~0.0.14" flat: "npm:^5.0.2" langsmith: "npm:~0.1.1" @@ -1472,26 +1973,26 @@ __metadata: optional: true ws: optional: true - checksum: 10c0/b0afd1052188d435c0189b6777ed323efa33cfda7485ca9b79e2dfbcfe3f792eb9d7b1ed3ea5a999c68b5db79563d1212cb22f60429d15a6df3ab1fd5ca0eeb2 + checksum: 10c0/d8c16c8108fbc713729733bd74499ab242ca2f0e765f8b57b9fff09720ffd2a0971b7a0ac013c1312469f1381ddc5eceb4b020db2ad9258b0b1df889d76f1c51 languageName: node linkType: hard -"@langchain/core@npm:~0.1.13, @langchain/core@npm:~0.1.32, @langchain/core@npm:~0.1.5": - version: 0.1.32 - resolution: "@langchain/core@npm:0.1.32" +"@langchain/core@npm:~0.1.32, @langchain/core@npm:~0.1.36, @langchain/core@npm:~0.1.39, @langchain/core@npm:~0.1.5": + version: 0.1.40 + resolution: "@langchain/core@npm:0.1.40" dependencies: ansi-styles: "npm:^5.0.0" camelcase: "npm:6" decamelize: "npm:1.2.0" js-tiktoken: "npm:^1.0.8" - langsmith: "npm:~0.1.1" + langsmith: "npm:~0.1.7" ml-distance: "npm:^4.0.0" p-queue: "npm:^6.6.2" p-retry: "npm:4" uuid: "npm:^9.0.0" zod: "npm:^3.22.4" zod-to-json-schema: "npm:^3.22.3" - checksum: 10c0/b3d074a256bc84473318730830da5a12f52e2b2b8a0eb7e778a0f44866c1ca232dcec7221eb7c72bd3515a830c7a365828a59bd382a1ebcc7c15e4485ad5bb72 + checksum: 10c0/dc2880bcf185f6fbe7838179bd5ae04144628213c646fcb62b092426e2a590665ae266482ee5efe5abf45fa21cd7127f9a2c398211a08d29290809f1f36d8176 languageName: node linkType: hard @@ -1506,15 +2007,15 @@ __metadata: linkType: hard "@langchain/openai@npm:~0.0.14": - version: 0.0.14 - resolution: "@langchain/openai@npm:0.0.14" + version: 0.0.15 + resolution: "@langchain/openai@npm:0.0.15" dependencies: - "@langchain/core": "npm:~0.1.13" + "@langchain/core": "npm:~0.1.39" js-tiktoken: "npm:^1.0.7" openai: "npm:^4.26.0" zod: "npm:^3.22.4" zod-to-json-schema: "npm:^3.22.3" - checksum: 10c0/6282beca2831e99fe1f3f7c1f663d6c69dbb84b5362aec38ba24a4d19cbeb659b101b58893d4184a2df7a79fdcc3677cebf7e97a2a77d91fcb73b251c836ca6d + checksum: 10c0/4fc0ab0cd3da922d38e4b73e662af0757d87db5f9b44c2650fd771a6f988d8f1b6c6048db6aa56640f450a13da1d4533ae95a046d7def41cc32cf20e6408bbd7 languageName: node linkType: hard @@ -1648,8 +2149,8 @@ __metadata: linkType: hard "@octokit/auth-app@npm:^6.0.0": - version: 6.0.3 - resolution: "@octokit/auth-app@npm:6.0.3" + version: 6.0.4 + resolution: "@octokit/auth-app@npm:6.0.4" dependencies: "@octokit/auth-oauth-app": "npm:^7.0.0" "@octokit/auth-oauth-user": "npm:^4.0.0" @@ -1660,7 +2161,7 @@ __metadata: lru-cache: "npm:^10.0.0" universal-github-app-jwt: "npm:^1.1.2" universal-user-agent: "npm:^6.0.0" - checksum: 10c0/fba541abcc35e05cd0adf49b4c0174a2bc8e5b44d702259e074640332578ce7fb03392523e64f64abafc266adbf6dda0a537ce0fa0bd265275793e81d7949244 + checksum: 10c0/600f02d0be587ce08929e14c23cfd289eef68a18309eb5c5ca75d104385ef63ae706e532248375696bee379da34e13b6f12a8dcc925d74d86b5ef4d09b034f92 languageName: node linkType: hard @@ -1875,13 +2376,13 @@ __metadata: linkType: hard "@octokit/plugin-paginate-rest@npm:^9.0.0": - version: 9.2.0 - resolution: "@octokit/plugin-paginate-rest@npm:9.2.0" + version: 9.2.1 + resolution: "@octokit/plugin-paginate-rest@npm:9.2.1" dependencies: "@octokit/types": "npm:^12.6.0" peerDependencies: - "@octokit/core": ">=5" - checksum: 10c0/4c8cd49040b88488a2f58beb0cdc3b0a1a224e527c0a5baafea5ddcb65a40c43b95ea03bdceaa0d400fd3c7226a2b4104a59aa990ec0ee6aaa2b524dfd0ec642 + "@octokit/core": 5 + checksum: 10c0/1dc55032a9e0c3e6440080a319975c9e4f189913fbc8870a48048d0c712473ea3d902ba247a37a46d45d502859b2728731a0d285107e4b0fa628d380f87163b4 languageName: node linkType: hard @@ -2063,14 +2564,14 @@ __metadata: languageName: node linkType: hard -"@playwright/test@npm:^1.41.2": - version: 1.41.2 - resolution: "@playwright/test@npm:1.41.2" +"@playwright/test@npm:^1.42.0": + version: 1.42.0 + resolution: "@playwright/test@npm:1.42.0" dependencies: - playwright: "npm:1.41.2" + playwright: "npm:1.42.0" bin: playwright: cli.js - checksum: 10c0/071fe307e7e46f550e8608ce3c2c207b7cfbda37b39f3dcbe3875eaa18e79f2a768a5795a8cfe21df9361ec63594de0359f5542dd3a3a7f6625300a98452a344 + checksum: 10c0/1505544fd4962cc9463c2e0d21958507b4b23ecb835ef19d81a97ae01cda9030585dc321263486cce4d1eac53724615b7b3ec41a94b6c1a54a2b7ed01157de60 languageName: node linkType: hard @@ -3173,10 +3674,10 @@ __metadata: languageName: node linkType: hard -"@remix-run/router@npm:1.15.1": - version: 1.15.1 - resolution: "@remix-run/router@npm:1.15.1" - checksum: 10c0/2f84d998defe9943a40fd5bf8794ee6ede521116ff24275cc2294830adb039ef86e34dbdd6555300600016fd8a58a244d4f4df73ff0b2cec7bd749f63d172587 +"@remix-run/router@npm:1.15.2": + version: 1.15.2 + resolution: "@remix-run/router@npm:1.15.2" + checksum: 10c0/7bcad98a91e8a2e822f3776360d284bee48f9ba2d3b7ee2235f95b8701da2f06de3db880a205c4fd4e78c9198eaf6272229a2e66574a8cf563befd428fdefeee languageName: node linkType: hard @@ -3290,30 +3791,30 @@ __metadata: languageName: node linkType: hard -"@rushstack/terminal@npm:0.9.0": - version: 0.9.0 - resolution: "@rushstack/terminal@npm:0.9.0" +"@rushstack/terminal@npm:0.10.0": + version: 0.10.0 + resolution: "@rushstack/terminal@npm:0.10.0" dependencies: "@rushstack/node-core-library": "npm:4.0.2" - colors: "npm:~1.2.1" + supports-color: "npm:~8.1.1" peerDependencies: "@types/node": "*" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/0a7638911ab34a0aaad1a3f196713bf42690c7bd2ea2fd73eb650ff6ce1b56bd9b3c859de0bf33c4a31c98e9c00436e6342a36a96254d964afa1aaa9eb3e186f + checksum: 10c0/128d13d353265bd318fc52a5d2eaf6d352d3abd29fc3500d630b4d114b43392e2dfe8c4df200e855dc2c07e6d4e8f2175c38b5a8b71dff1eee7aa1f5a261e1c7 languageName: node linkType: hard "@rushstack/ts-command-line@npm:^4.12.2": - version: 4.17.3 - resolution: "@rushstack/ts-command-line@npm:4.17.3" + version: 4.18.1 + resolution: "@rushstack/ts-command-line@npm:4.18.1" dependencies: - "@rushstack/terminal": "npm:0.9.0" + "@rushstack/terminal": "npm:0.10.0" "@types/argparse": "npm:1.0.38" argparse: "npm:~1.0.9" string-argv: "npm:~0.3.1" - checksum: 10c0/8f219b06f456d93e9271d72f3b720912bb5ec115ad9c6a4326ab5c9ed686db350c9629e4e05d8ad7cafd3087525600ee884ce61a67b0c2cacecd0f61832391fe + checksum: 10c0/6c35f2c698cbf42492875ec09a282584a9c1f9dd3a4b90a66930341819f92f9344af8be8e9dae4410eb4a72974842feaf8da5da01d8ca748bb9a4a00b0f3b8eb languageName: node linkType: hard @@ -3327,6 +3828,22 @@ __metadata: languageName: node linkType: hard +"@shikijs/core@npm:1.1.7, @shikijs/core@npm:^1.1.5": + version: 1.1.7 + resolution: "@shikijs/core@npm:1.1.7" + checksum: 10c0/ee59b88d4c81422792651c0ca52ff378c3035f9d1e4907b58c1d6da06fad02d530775a2e6f43bb033832cd3d2a5f69c9aa4eb5b6b05311396acc503f15442f37 + languageName: node + linkType: hard + +"@shikijs/transformers@npm:^1.1.5": + version: 1.1.7 + resolution: "@shikijs/transformers@npm:1.1.7" + dependencies: + shiki: "npm:1.1.7" + checksum: 10c0/be2794c35ba6d57da11e3ed509d714dd4533c2658c31182df61a7a6d38d94847564a1ae1acb9ce22dfc08702702769647ec545ba04053de8361d5019227be876 + languageName: node + linkType: hard + "@sindresorhus/is@npm:^4.0.0": version: 4.6.0 resolution: "@sindresorhus/is@npm:4.6.0" @@ -3525,11 +4042,11 @@ __metadata: linkType: hard "@types/estree-jsx@npm:^1.0.0": - version: 1.0.4 - resolution: "@types/estree-jsx@npm:1.0.4" + version: 1.0.5 + resolution: "@types/estree-jsx@npm:1.0.5" dependencies: "@types/estree": "npm:*" - checksum: 10c0/d444f85f4b07fee3a8819148ccbc546299a5afed16e9059af149363492d56e07570d70776d6d9eb75e55846b4f78ffbb185bc6b591991fcfe02da44635f139e0 + checksum: 10c0/07b354331516428b27a3ab99ee397547d47eb223c34053b48f84872fafb841770834b90cc1a0068398e7c7ccb15ec51ab00ec64b31dc5e3dbefd624638a35c6d languageName: node linkType: hard @@ -3643,11 +4160,11 @@ __metadata: linkType: hard "@types/jsonwebtoken@npm:^9.0.0": - version: 9.0.5 - resolution: "@types/jsonwebtoken@npm:9.0.5" + version: 9.0.6 + resolution: "@types/jsonwebtoken@npm:9.0.6" dependencies: "@types/node": "npm:*" - checksum: 10c0/c582b8420586f3b9550f7e34992cb32be300bc953636f3b087ed9c180ce7ea5c2e4b35090be2d57f0d3168cc3ca1074932907caa2afe09f4e9c84cf5c0daefa8 + checksum: 10c0/9c29e3896e5fb6056e54d87514643e59e0cfb966ae25171a107776270195bba955f0373e98c8ed6450c145b18984f5df9cf0fcac360f382cec3c7c4d3510b202 languageName: node linkType: hard @@ -3660,6 +4177,13 @@ __metadata: languageName: node linkType: hard +"@types/linkify-it@npm:*": + version: 3.0.5 + resolution: "@types/linkify-it@npm:3.0.5" + checksum: 10c0/696e09975991c649ba37c5585714929fdebf5c64a8bfb99910613ef838337dbbba6c608fccdfa03d6347432586ef12e139bc0e947ae6fec569096fef5cc1c550 + languageName: node + linkType: hard + "@types/lodash@npm:^4.14.202": version: 4.14.202 resolution: "@types/lodash@npm:4.14.202" @@ -3676,6 +4200,16 @@ __metadata: languageName: node linkType: hard +"@types/markdown-it@npm:^13.0.7": + version: 13.0.7 + resolution: "@types/markdown-it@npm:13.0.7" + dependencies: + "@types/linkify-it": "npm:*" + "@types/mdurl": "npm:*" + checksum: 10c0/8a0fda0eb518ca2b25fcb5da32398930729270e9095cd4f7f3e379098b9d0f9e6336974becf2f36e69bbdbdc57818fef731149988c9e98e9f3f47501fefd9d39 + languageName: node + linkType: hard + "@types/mdast@npm:^4.0.0": version: 4.0.3 resolution: "@types/mdast@npm:4.0.3" @@ -3685,6 +4219,13 @@ __metadata: languageName: node linkType: hard +"@types/mdurl@npm:*": + version: 1.0.5 + resolution: "@types/mdurl@npm:1.0.5" + checksum: 10c0/8991c781eb94fb3621e48e191251a94057908fc14be60f52bdd7c48684af923ffa77559ea979450a0475f85c08f8a472f99ff9c2ca4308961b9b9d35fd7584f7 + languageName: node + linkType: hard + "@types/minimatch@npm:*": version: 5.1.2 resolution: "@types/minimatch@npm:5.1.2" @@ -3716,12 +4257,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^20.11.19, @types/node@npm:^20.9.0": - version: 20.11.20 - resolution: "@types/node@npm:20.11.20" +"@types/node@npm:*, @types/node@npm:^20.11.24, @types/node@npm:^20.9.0": + version: 20.11.24 + resolution: "@types/node@npm:20.11.24" dependencies: undici-types: "npm:~5.26.4" - checksum: 10c0/8e8de211e6d54425c603388a9b5cc9c434101985d0a1c88aabbf65d10df2b1fccd71855c20e61ae8a75c7aea56cb0f64e722cf7914cff1247d0b62ce21996ac4 + checksum: 10c0/5a62225eb4797b41e6953f9c08c4611d607b5422ddd153312fc81ed6ed37115228ae27e3e3caa1a3bf52d88310306a196ba1cfbd8b2ec918a20f64d80dfa22c9 languageName: node linkType: hard @@ -3733,11 +4274,11 @@ __metadata: linkType: hard "@types/node@npm:^18.11.18, @types/node@npm:^18.16.3": - version: 18.19.18 - resolution: "@types/node@npm:18.19.18" + version: 18.19.21 + resolution: "@types/node@npm:18.19.21" dependencies: undici-types: "npm:~5.26.4" - checksum: 10c0/94c786bef8a4d02b1ea0b638a72ed77f16d732dec530d615fe729c72f0fa87191f82a2ac2b1c187f5354967dddfe49b1d5c177a8b3cfb6ba182c173a5e6d6b3d + checksum: 10c0/3175d482d2fb15cfda4697c74a61dffe180a4f030c9cc7add39bac89a8200662289431ea9317159bc29e53f340e0ce3fa91c732c81d4e7d3d755e58d0d1b3a3e languageName: node linkType: hard @@ -3764,14 +4305,14 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:*, @types/react@npm:^18.2.57": - version: 18.2.57 - resolution: "@types/react@npm:18.2.57" +"@types/react@npm:*, @types/react@npm:^18.2.61": + version: 18.2.61 + resolution: "@types/react@npm:18.2.61" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/d5ed2f04c069c591e41ef1bea5b70f89dc7a4edff2254c4df801ddaa21b43b2aa70c106c049b9b6736f98f5afe66576d0e75a9e47c7044f2660b1744ff64f535 + checksum: 10c0/a03fbb6ca8108bbccf12ac616e77e1457ae9324040c4a5d1293caaa62c187300b4eb38ec78c4724fb43d40d4c6fb909803db057c8b69ae441e2aab7b2acdc29a languageName: node linkType: hard @@ -3799,9 +4340,9 @@ __metadata: linkType: hard "@types/semver@npm:^7.5.0": - version: 7.5.7 - resolution: "@types/semver@npm:7.5.7" - checksum: 10c0/fb72d8b86a7779650f14ae89542f1da2ab624adb8188d98754b1d29a2fe3d41f0348bf9435b60ad145df1812fd2a09b3256779aa23b532c199f3dee59619a1eb + version: 7.5.8 + resolution: "@types/semver@npm:7.5.8" + checksum: 10c0/8663ff927234d1c5fcc04b33062cb2b9fcfbe0f5f351ed26c4d1e1581657deebd506b41ff7fdf89e787e3d33ce05854bc01686379b89e9c49b564c4cfa988efa languageName: node linkType: hard @@ -3849,6 +4390,13 @@ __metadata: languageName: node linkType: hard +"@types/web-bluetooth@npm:^0.0.20": + version: 0.0.20 + resolution: "@types/web-bluetooth@npm:0.0.20" + checksum: 10c0/3a49bd9396506af8f1b047db087aeeea9fe4301b7fad4fe06ae0f6e00d331138caae878fd09e6410658b70b4aaf10e4b191c41c1a5ff72211fe58da290c7d003 + languageName: node + linkType: hard + "@types/webrtc@npm:^0.0.37": version: 0.0.37 resolution: "@types/webrtc@npm:0.0.37" @@ -3872,15 +4420,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/eslint-plugin@npm:7.0.2" +"@typescript-eslint/eslint-plugin@npm:^7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/eslint-plugin@npm:7.1.0" dependencies: "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:7.0.2" - "@typescript-eslint/type-utils": "npm:7.0.2" - "@typescript-eslint/utils": "npm:7.0.2" - "@typescript-eslint/visitor-keys": "npm:7.0.2" + "@typescript-eslint/scope-manager": "npm:7.1.0" + "@typescript-eslint/type-utils": "npm:7.1.0" + "@typescript-eslint/utils": "npm:7.1.0" + "@typescript-eslint/visitor-keys": "npm:7.1.0" debug: "npm:^4.3.4" graphemer: "npm:^1.4.0" ignore: "npm:^5.2.4" @@ -3893,44 +4441,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/76727ad48f01c1bb4ef37690e7ed12754930ce3a4bbe5dcd52f24d42f4625fc0b151db8189947f3956b4a09a562eb2da683ff65b57a13a15426eee3b680f80a5 + checksum: 10c0/e5644a987969cbb614bbf766b6bf51341e123c774953690548610147eae0041d70e48ef42be97b68a6e2f5ed9aae37fe040e8054d35bb0568c14194ba564b2d8 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/parser@npm:7.0.2" +"@typescript-eslint/parser@npm:^7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/parser@npm:7.1.0" dependencies: - "@typescript-eslint/scope-manager": "npm:7.0.2" - "@typescript-eslint/types": "npm:7.0.2" - "@typescript-eslint/typescript-estree": "npm:7.0.2" - "@typescript-eslint/visitor-keys": "npm:7.0.2" + "@typescript-eslint/scope-manager": "npm:7.1.0" + "@typescript-eslint/types": "npm:7.1.0" + "@typescript-eslint/typescript-estree": "npm:7.1.0" + "@typescript-eslint/visitor-keys": "npm:7.1.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/acffdbea0bba24398ba8bd1ccf5b59438bc093e41d7a325019383094f39d676b5cf2f5963bfa5e332e54728e5b9e14be3984752ee91da6f0e1a3e0b613422d0e + checksum: 10c0/8fcbfc8c0c86abb750173096e7ca09e1cd44aba3f6115bdb94ffb6b409b86ee23526e9d5a44935b69a6be2385893e66d8e55d92063206028dc48f70d379afcab languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/scope-manager@npm:7.0.2" +"@typescript-eslint/scope-manager@npm:7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/scope-manager@npm:7.1.0" dependencies: - "@typescript-eslint/types": "npm:7.0.2" - "@typescript-eslint/visitor-keys": "npm:7.0.2" - checksum: 10c0/60241a0dbed7605133b6242d7fc172e8ee649e1033b8a179cebe3e21c60e0c08c12679fd37644cfef57c95a5d75a3927afc9d6365a5f9684c1d043285db23c66 + "@typescript-eslint/types": "npm:7.1.0" + "@typescript-eslint/visitor-keys": "npm:7.1.0" + checksum: 10c0/2fd167730bbe984343ab94739b00bd82e8cdeea9e63674b099cc5c89b420b28dbf79f40dab48022dc717db8d14ae6ee2739e0fcbdcc0321bc9da5f2602b55788 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/type-utils@npm:7.0.2" +"@typescript-eslint/type-utils@npm:7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/type-utils@npm:7.1.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:7.0.2" - "@typescript-eslint/utils": "npm:7.0.2" + "@typescript-eslint/typescript-estree": "npm:7.1.0" + "@typescript-eslint/utils": "npm:7.1.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.0.1" peerDependencies: @@ -3938,23 +4486,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/fa7957aa65cb0d7366c7c9be94e45cc2f1ebe9981cbf393054b505c6d555a01b2a2fe7cd1254d668f30183a275032f909186ce0b9f213f64b776bd7872144a6e + checksum: 10c0/3e3eea6c03692a643bf4ed11646b0679c6ff13baf1647d97e793f3d8c3adb83061e27a17c2a1470166a3c6c444b974bebc8096d36e0b4b3c36c289ff38bcfc9b languageName: node linkType: hard -"@typescript-eslint/types@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/types@npm:7.0.2" - checksum: 10c0/5f95266cc2cd0e6cf1239dcd36b53c7d98b01ba12c61947316f0d879df87b912b4d23f0796324e2ab0fb8780503a338da41a4695fa91d90392b6c6aca5239fa7 +"@typescript-eslint/types@npm:7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/types@npm:7.1.0" + checksum: 10c0/095cde3e773b7605c5e0c86642002768ced09e94def7f3c6f49a67863f47d7c8ae15413a4ab1a2407f779d1b5ede5fb3000bc98b1cf9ed7ec938acc38cac89e7 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/typescript-estree@npm:7.0.2" +"@typescript-eslint/typescript-estree@npm:7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/typescript-estree@npm:7.1.0" dependencies: - "@typescript-eslint/types": "npm:7.0.2" - "@typescript-eslint/visitor-keys": "npm:7.0.2" + "@typescript-eslint/types": "npm:7.1.0" + "@typescript-eslint/visitor-keys": "npm:7.1.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -3964,34 +4512,34 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/2f6795b05fced9f2e0887f6735aa1a0b20516952792e4be13cd94c5e56db8ad013ba27aeb56f89fedff8b7af587f854482f00aac75b418611c74e42169c29aeb + checksum: 10c0/063845dc8526dfda722d1b00960443a5158d1bce2bc39bf49bd353f33f42aa30116105a87b55a04df3eaef99c0d1c13fb987c53848dff43de6152c66dd3ba41c languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/utils@npm:7.0.2" +"@typescript-eslint/utils@npm:7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/utils@npm:7.1.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" "@types/json-schema": "npm:^7.0.12" "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:7.0.2" - "@typescript-eslint/types": "npm:7.0.2" - "@typescript-eslint/typescript-estree": "npm:7.0.2" + "@typescript-eslint/scope-manager": "npm:7.1.0" + "@typescript-eslint/types": "npm:7.1.0" + "@typescript-eslint/typescript-estree": "npm:7.1.0" semver: "npm:^7.5.4" peerDependencies: eslint: ^8.56.0 - checksum: 10c0/b4ae9a36393c92b332e99d70219d1ee056271261f7433924db804e5f06d97ca60408b9c7a655afce8a851982e7153243a625d6cc76fea764f767f96c8f3e16da + checksum: 10c0/3fefd51307d0e294462106c57c4b12cd610bfe1bdcc5ca0142bfac6a5d0d37c18d14be5ec89740eb85515f5512f45219a6048df0efccd457e96f9d0612af4abf languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.0.2": - version: 7.0.2 - resolution: "@typescript-eslint/visitor-keys@npm:7.0.2" +"@typescript-eslint/visitor-keys@npm:7.1.0": + version: 7.1.0 + resolution: "@typescript-eslint/visitor-keys@npm:7.1.0" dependencies: - "@typescript-eslint/types": "npm:7.0.2" + "@typescript-eslint/types": "npm:7.1.0" eslint-visitor-keys: "npm:^3.4.1" - checksum: 10c0/4146d1ad6ce9374e6b5a75677fc709816bdc5fe324b1a857405f21dad23bb28c79cfd0555bc2a01c4af1d9e9ee81ff5e29ec41cc9d05b0b1101cc4264e7f21d1 + checksum: 10c0/9015a10e6ee2a99fc99e0f7a3f274496a813c2c239e868f29e7c0da919c825fe192fe21d3410c43d8a801e8186b51f08ef06523d2c3010570d893a1486ac293d languageName: node linkType: hard @@ -4012,15 +4560,15 @@ __metadata: languageName: node linkType: hard -"@vidstack/react@npm:^1.10.9": - version: 1.10.9 - resolution: "@vidstack/react@npm:1.10.9" - dependencies: - media-captions: "npm:^1.0.1" +"@vidstack/react@npm:^0.6.14": + version: 0.6.14 + resolution: "@vidstack/react@npm:0.6.14" peerDependencies: "@types/react": ^18.0.0 + maverick.js: 0.37.0 react: ^18.0.0 - checksum: 10c0/200a907b39c4ae5759151323bc460c69dec1369e2266c90106e282a791a9b15e3096bef522eca4664943629f7f4868acbd53b49c20470ecbbefa8cfa54a64e81 + vidstack: 0.6.14 + checksum: 10c0/de5d48a430c37707e5206fa4c1f14d33b19a22c6a224f37c2f84abe96129c3e88ce47e96738f6ff1a1e975d17127bb19dd92de4538cb0d2d31cbdeba6105d171 languageName: node linkType: hard @@ -4028,14 +4576,233 @@ __metadata: version: 4.2.1 resolution: "@vitejs/plugin-react@npm:4.2.1" dependencies: - "@babel/core": "npm:^7.23.5" - "@babel/plugin-transform-react-jsx-self": "npm:^7.23.3" - "@babel/plugin-transform-react-jsx-source": "npm:^7.23.3" - "@types/babel__core": "npm:^7.20.5" - react-refresh: "npm:^0.14.0" - peerDependencies: - vite: ^4.2.0 || ^5.0.0 - checksum: 10c0/de1eec44d703f32e5b58e776328ca20793657fe991835d15b290230b19a2a08be5d31501d424279ae13ecfed28044c117b69d746891c8d9b92c69e8a8907e989 + "@babel/core": "npm:^7.23.5" + "@babel/plugin-transform-react-jsx-self": "npm:^7.23.3" + "@babel/plugin-transform-react-jsx-source": "npm:^7.23.3" + "@types/babel__core": "npm:^7.20.5" + react-refresh: "npm:^0.14.0" + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + checksum: 10c0/de1eec44d703f32e5b58e776328ca20793657fe991835d15b290230b19a2a08be5d31501d424279ae13ecfed28044c117b69d746891c8d9b92c69e8a8907e989 + languageName: node + linkType: hard + +"@vitejs/plugin-vue@npm:^5.0.4": + version: 5.0.4 + resolution: "@vitejs/plugin-vue@npm:5.0.4" + peerDependencies: + vite: ^5.0.0 + vue: ^3.2.25 + checksum: 10c0/2e65900ff41037a013ef40351aa2fb68ee1963da461795b4e3d01fc4a0226c65e9ca4bc39941dc163f883773bcd80744ee0f1f96ecc2f46fae1a4cd71c741308 + languageName: node + linkType: hard + +"@vue/compiler-core@npm:3.4.21": + version: 3.4.21 + resolution: "@vue/compiler-core@npm:3.4.21" + dependencies: + "@babel/parser": "npm:^7.23.9" + "@vue/shared": "npm:3.4.21" + entities: "npm:^4.5.0" + estree-walker: "npm:^2.0.2" + source-map-js: "npm:^1.0.2" + checksum: 10c0/3ee871b95e17948d10375093c8dd3265923f844528a24ac67512c201ddb9b628021c010565f3e50f2e551b217c502e80a7901384f616a977a04f81e68c64a37c + languageName: node + linkType: hard + +"@vue/compiler-dom@npm:3.4.21": + version: 3.4.21 + resolution: "@vue/compiler-dom@npm:3.4.21" + dependencies: + "@vue/compiler-core": "npm:3.4.21" + "@vue/shared": "npm:3.4.21" + checksum: 10c0/b4a1099eddacded2663d12388b48088ca0be0d8969a070476f49e4e65da9b22851fc897cc693662b178e7e7fdee98fcf9ea3617a1f626c3a1b2089815cb1264e + languageName: node + linkType: hard + +"@vue/compiler-sfc@npm:3.4.21": + version: 3.4.21 + resolution: "@vue/compiler-sfc@npm:3.4.21" + dependencies: + "@babel/parser": "npm:^7.23.9" + "@vue/compiler-core": "npm:3.4.21" + "@vue/compiler-dom": "npm:3.4.21" + "@vue/compiler-ssr": "npm:3.4.21" + "@vue/shared": "npm:3.4.21" + estree-walker: "npm:^2.0.2" + magic-string: "npm:^0.30.7" + postcss: "npm:^8.4.35" + source-map-js: "npm:^1.0.2" + checksum: 10c0/8d9a6ee07a9c542528f09b7a99e5d40e9752dca39251994e4309cb6121997c47db6818be75555aa69fb4f0bd54820bc7675c0c6e2ea5afe339f09d40890d26a9 + languageName: node + linkType: hard + +"@vue/compiler-ssr@npm:3.4.21": + version: 3.4.21 + resolution: "@vue/compiler-ssr@npm:3.4.21" + dependencies: + "@vue/compiler-dom": "npm:3.4.21" + "@vue/shared": "npm:3.4.21" + checksum: 10c0/bae2b76f8619f258a90e2964cdcebef44aa240ae64be6bb08227f3404239c66f3d77fb25b88a809d9b29063a2f0f423595c8be8e5f7c80dc8337da2aad4f6fdc + languageName: node + linkType: hard + +"@vue/devtools-api@npm:^7.0.14": + version: 7.0.15 + resolution: "@vue/devtools-api@npm:7.0.15" + dependencies: + "@vue/devtools-kit": "npm:^7.0.15" + checksum: 10c0/4e08962f4ebea46025f26b80d189a11deb89c0205e17198d5018c1f831fbad537068dcea3830a8dc77481eadf19938f83ebfa158ab989393ddc58fc031b6d3e8 + languageName: node + linkType: hard + +"@vue/devtools-kit@npm:^7.0.15": + version: 7.0.15 + resolution: "@vue/devtools-kit@npm:7.0.15" + dependencies: + "@vue/devtools-shared": "npm:^7.0.15" + hookable: "npm:^5.5.3" + mitt: "npm:^3.0.1" + perfect-debounce: "npm:^1.0.0" + speakingurl: "npm:^14.0.1" + peerDependencies: + vue: ^3.0.0 + checksum: 10c0/c2b201345693f03bd33ed69e6fea1e5282ca37e57d0b89ad3ce6dbce22b760ec035ff835274b2cf3040f8e303df588cc282333767b7753401ea00218904810ab + languageName: node + linkType: hard + +"@vue/devtools-shared@npm:^7.0.15": + version: 7.0.15 + resolution: "@vue/devtools-shared@npm:7.0.15" + dependencies: + rfdc: "npm:^1.3.1" + checksum: 10c0/d5e6e80b1fa3ddac710afc83b2a3a59c26d3527622cd70388f3318de4454408b37effb94b3b896a5c2fe1e4a158faa828ef569e50051cc69a8f02ca273d6dedc + languageName: node + linkType: hard + +"@vue/reactivity@npm:3.4.21": + version: 3.4.21 + resolution: "@vue/reactivity@npm:3.4.21" + dependencies: + "@vue/shared": "npm:3.4.21" + checksum: 10c0/9296ba12dc87bed7c056801a8cbff215ff4245404078186188f3c549a075f159acc7eeaf876a949450d22fc1c99a5b9f1818b4c0f828feaaf25273476ff4244b + languageName: node + linkType: hard + +"@vue/runtime-core@npm:3.4.21": + version: 3.4.21 + resolution: "@vue/runtime-core@npm:3.4.21" + dependencies: + "@vue/reactivity": "npm:3.4.21" + "@vue/shared": "npm:3.4.21" + checksum: 10c0/9d57aaf24b33c21f4b632c1efca3baac6af420676e2f3ef0d79f0efd606617d1be56f2bd345afb1960a5603f2f5f48bbb80535403cd526f3bbba1322f823ce5b + languageName: node + linkType: hard + +"@vue/runtime-dom@npm:3.4.21": + version: 3.4.21 + resolution: "@vue/runtime-dom@npm:3.4.21" + dependencies: + "@vue/runtime-core": "npm:3.4.21" + "@vue/shared": "npm:3.4.21" + csstype: "npm:^3.1.3" + checksum: 10c0/29ad38e1c9c6286bb7dfbc3d1830b03f73f870183f9e9d81e6dbc11a71f6ff7ec2a0428832d678d8ed9e8722a98580202597adde57dcc3b47f848abb7b8d16c2 + languageName: node + linkType: hard + +"@vue/server-renderer@npm:3.4.21": + version: 3.4.21 + resolution: "@vue/server-renderer@npm:3.4.21" + dependencies: + "@vue/compiler-ssr": "npm:3.4.21" + "@vue/shared": "npm:3.4.21" + peerDependencies: + vue: 3.4.21 + checksum: 10c0/3ff91392473cea8d85a11e8315bf378fd0cb4b5e4f650acad3b1bc672ceb3a0e29d22d4860186b06697b72a8ab544d67ba7969e77fed07a402c3528f90c764ed + languageName: node + linkType: hard + +"@vue/shared@npm:3.4.21": + version: 3.4.21 + resolution: "@vue/shared@npm:3.4.21" + checksum: 10c0/79cba4228c3c1769ba8024302d7dbebf6ed1b77fb2e7a69e635cdebaa1c18b409e9c27ce27ccbe3a98e702a7e2dae1b87754d87f0b29adfe2a8f9e1e7c7899d5 + languageName: node + linkType: hard + +"@vueuse/core@npm:10.9.0, @vueuse/core@npm:^10.7.2": + version: 10.9.0 + resolution: "@vueuse/core@npm:10.9.0" + dependencies: + "@types/web-bluetooth": "npm:^0.0.20" + "@vueuse/metadata": "npm:10.9.0" + "@vueuse/shared": "npm:10.9.0" + vue-demi: "npm:>=0.14.7" + checksum: 10c0/d5c90a5bdd2dc5123a594e6ff9bc96f70f8f062fe9749d1c194d15516acfee7dd2f99ef9d1c6b06a9d18e7a13a0287ff0e5ee8a2565a04810196c90bb13daf91 + languageName: node + linkType: hard + +"@vueuse/integrations@npm:^10.7.2": + version: 10.9.0 + resolution: "@vueuse/integrations@npm:10.9.0" + dependencies: + "@vueuse/core": "npm:10.9.0" + "@vueuse/shared": "npm:10.9.0" + vue-demi: "npm:>=0.14.7" + peerDependencies: + async-validator: "*" + axios: "*" + change-case: "*" + drauu: "*" + focus-trap: "*" + fuse.js: "*" + idb-keyval: "*" + jwt-decode: "*" + nprogress: "*" + qrcode: "*" + sortablejs: "*" + universal-cookie: "*" + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + checksum: 10c0/ff420121c9a8f4da7a6f54ac9c2d303da3d4ad6b662e510dcb26cc1b97abd64d06f8980663abe819cc3ec1a8f8d336b7ce525893132cceae5f245bb0c0e068ac + languageName: node + linkType: hard + +"@vueuse/metadata@npm:10.9.0": + version: 10.9.0 + resolution: "@vueuse/metadata@npm:10.9.0" + checksum: 10c0/7f647b2ae73ff86c4de658c84a51988f7cdfec1643e1e706d5b29034bd949e240cffacf52505ab8e9223bb245f7bafe7f7bfa5c32702172ba29afc4aef96b475 + languageName: node + linkType: hard + +"@vueuse/shared@npm:10.9.0": + version: 10.9.0 + resolution: "@vueuse/shared@npm:10.9.0" + dependencies: + vue-demi: "npm:>=0.14.7" + checksum: 10c0/55593c325b9dc15cfe9eaf84ca2a757a0c418491be56760f5560a641dfe2579c72cb55ccd04ead71217a97fc6b17ad7b7b7b9177b376bc6967174121707d1c49 languageName: node linkType: hard @@ -4160,6 +4927,28 @@ __metadata: languageName: node linkType: hard +"algoliasearch@npm:^4.19.1": + version: 4.22.1 + resolution: "algoliasearch@npm:4.22.1" + dependencies: + "@algolia/cache-browser-local-storage": "npm:4.22.1" + "@algolia/cache-common": "npm:4.22.1" + "@algolia/cache-in-memory": "npm:4.22.1" + "@algolia/client-account": "npm:4.22.1" + "@algolia/client-analytics": "npm:4.22.1" + "@algolia/client-common": "npm:4.22.1" + "@algolia/client-personalization": "npm:4.22.1" + "@algolia/client-search": "npm:4.22.1" + "@algolia/logger-common": "npm:4.22.1" + "@algolia/logger-console": "npm:4.22.1" + "@algolia/requester-browser-xhr": "npm:4.22.1" + "@algolia/requester-common": "npm:4.22.1" + "@algolia/requester-node-http": "npm:4.22.1" + "@algolia/transporter": "npm:4.22.1" + checksum: 10c0/0e0d0e84c532ad72428da35a36beec0aabdbcf3fd202070be5aafa2d4c51c8fbb98e6bcaabe745b0e95858887ec5ec603854d04571d19fe3f7325d799e54f231 + languageName: node + linkType: hard + "ansi-escapes@npm:^4.3.0": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" @@ -4232,6 +5021,27 @@ __metadata: languageName: node linkType: hard +"appdmg@npm:^0.6.4": + version: 0.6.6 + resolution: "appdmg@npm:0.6.6" + dependencies: + async: "npm:^1.4.2" + ds-store: "npm:^0.1.5" + execa: "npm:^1.0.0" + fs-temp: "npm:^1.0.0" + fs-xattr: "npm:^0.3.0" + image-size: "npm:^0.7.4" + is-my-json-valid: "npm:^2.20.0" + minimist: "npm:^1.1.3" + parse-color: "npm:^1.0.0" + path-exists: "npm:^4.0.0" + repeat-string: "npm:^1.5.4" + bin: + appdmg: bin/appdmg.js + conditions: os=darwin + languageName: node + linkType: hard + "aproba@npm:^1.0.3 || ^2.0.0": version: 2.0.0 resolution: "aproba@npm:2.0.0" @@ -4432,6 +5242,13 @@ __metadata: languageName: node linkType: hard +"async@npm:^1.4.2": + version: 1.5.2 + resolution: "async@npm:1.5.2" + checksum: 10c0/9ee84592c393aad1047d1223004317ecc65a9a3f76101e0f4614a0818eac962e666510353400a3c9ea158df540579a293f486f3578e918c5e90a0f5ed52e8aea + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -4519,6 +5336,15 @@ __metadata: languageName: node linkType: hard +"base32-encode@npm:^0.1.0 || ^1.0.0": + version: 1.2.0 + resolution: "base32-encode@npm:1.2.0" + dependencies: + to-data-view: "npm:^1.1.0" + checksum: 10c0/ebc97b324b90ad64c019a338c2cb9291f7e260584b8222bd0861bf69e0509153263e40ee2546c744cc1849b353339dbd98a0cb08c5c37bab221a41010522a0e2 + languageName: node + linkType: hard + "base64-js@npm:^1.3.1, base64-js@npm:^1.5.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" @@ -4527,9 +5353,9 @@ __metadata: linkType: hard "basic-ftp@npm:^5.0.2": - version: 5.0.4 - resolution: "basic-ftp@npm:5.0.4" - checksum: 10c0/0bd580652a4f75d5ea8e442e27921ff7089c91764f9eab975235d0b177bb7631339cbf50fb8f4cd5c94087ac6c003a8c80e33076228fd94e23e99d42531e3ac0 + version: 5.0.5 + resolution: "basic-ftp@npm:5.0.5" + checksum: 10c0/be983a3997749856da87b839ffce6b8ed6c7dbf91ea991d5c980d8add275f9f2926c19f80217ac3e7f353815be879371d636407ca72b038cea8cab30e53928a6 languageName: node linkType: hard @@ -4592,12 +5418,12 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.1": - version: 1.20.1 - resolution: "body-parser@npm:1.20.1" +"body-parser@npm:1.20.2": + version: 1.20.2 + resolution: "body-parser@npm:1.20.2" dependencies: bytes: "npm:3.1.2" - content-type: "npm:~1.0.4" + content-type: "npm:~1.0.5" debug: "npm:2.6.9" depd: "npm:2.0.0" destroy: "npm:1.2.0" @@ -4605,10 +5431,10 @@ __metadata: iconv-lite: "npm:0.4.24" on-finished: "npm:2.4.1" qs: "npm:6.11.0" - raw-body: "npm:2.5.1" + raw-body: "npm:2.5.2" type-is: "npm:~1.6.18" unpipe: "npm:1.0.0" - checksum: 10c0/a202d493e2c10a33fb7413dac7d2f713be579c4b88343cd814b6df7a38e5af1901fc31044e04de176db56b16d9772aa25a7723f64478c20f4d91b1ac223bf3b8 + checksum: 10c0/06f1438fff388a2e2354c96aa3ea8147b79bfcb1262dfcc2aae68ec13723d01d5781680657b74e9f83c808266d5baf52804032fbde2b7382b89bd8cdb273ace9 languageName: node linkType: hard @@ -4633,6 +5459,15 @@ __metadata: languageName: node linkType: hard +"bplist-creator@npm:~0.0.3": + version: 0.0.8 + resolution: "bplist-creator@npm:0.0.8" + dependencies: + stream-buffers: "npm:~2.2.0" + checksum: 10c0/21c865784db7f14ca26ff20b4aab85b87577549f7592271c22052de6df95cfab9cc7671f602106f4c9e6dc9c0de9710c907b8d4f7345427a710ae8616a578587 + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -4875,9 +5710,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001578, caniuse-lite@npm:^1.0.30001587": - version: 1.0.30001589 - resolution: "caniuse-lite@npm:1.0.30001589" - checksum: 10c0/20debfb949413f603011bc7dacaf050010778bc4f8632c86fafd1bd0c43180c95ae7c31f6c82348f6309e5e221934e327c3607a216e3f09640284acf78cd6d4d + version: 1.0.30001591 + resolution: "caniuse-lite@npm:1.0.30001591" + checksum: 10c0/21937d341c3d75994504db21340f65573a1e847a8ab33ee4964ed493994d6552864c494ba144485459abd9c711c75c0708bc9fa19f2bff525bff75ffb0a42c3b languageName: node linkType: hard @@ -5160,6 +5995,13 @@ __metadata: languageName: node linkType: hard +"color-convert@npm:~0.5.0": + version: 0.5.3 + resolution: "color-convert@npm:0.5.3" + checksum: 10c0/324b863446bab6c5f88cb0010c3a16a6ca6bf6709eb7b7b3482d3e9ca6cfcfa690c25c1151bd2dc6279a0f4e2c593630486a2b9caae3c3eb96b82f5408e23e54 + languageName: node + linkType: hard + "color-name@npm:1.1.3": version: 1.1.3 resolution: "color-name@npm:1.1.3" @@ -5190,13 +6032,6 @@ __metadata: languageName: node linkType: hard -"colors@npm:~1.2.1": - version: 1.2.5 - resolution: "colors@npm:1.2.5" - checksum: 10c0/f4acebf2d2da9b4f8afb770361d14c01034bcb43add4cae493e7d186dcd7e0c5e2b440520fbfdf636e872606a0eb86b1f69fcf2f087df2876a4e222612539ee0 - languageName: node - linkType: hard - "combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -5321,7 +6156,7 @@ __metadata: languageName: node linkType: hard -"content-type@npm:~1.0.4": +"content-type@npm:~1.0.4, content-type@npm:~1.0.5": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af @@ -5441,7 +6276,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2": +"csstype@npm:^3.0.2, csstype@npm:^3.1.3": version: 3.1.3 resolution: "csstype@npm:3.1.3" checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 @@ -5805,6 +6640,17 @@ __metadata: languageName: node linkType: hard +"ds-store@npm:^0.1.5": + version: 0.1.6 + resolution: "ds-store@npm:0.1.6" + dependencies: + bplist-creator: "npm:~0.0.3" + macos-alias: "npm:~0.2.5" + tn1150: "npm:^0.1.0" + checksum: 10c0/40293e925e27fa6df7f043320a2e277c5901368c49a7e420ecfc510dd843a6878b92875b126b841b53a70be7a6ab67338582b7f7ffd4ace3e581cf15aea0a1e2 + languageName: node + linkType: hard + "duplexer@npm:~0.1.1": version: 0.1.2 resolution: "duplexer@npm:0.1.2" @@ -5881,6 +6727,22 @@ __metadata: languageName: node linkType: hard +"electron-installer-dmg@npm:^4.0.0": + version: 4.0.0 + resolution: "electron-installer-dmg@npm:4.0.0" + dependencies: + appdmg: "npm:^0.6.4" + debug: "npm:^4.3.2" + minimist: "npm:^1.1.1" + dependenciesMeta: + appdmg: + optional: true + bin: + electron-installer-dmg: bin/electron-installer-dmg.js + checksum: 10c0/5e257a67c1fa08306f6b451b481c9559ed0e75c5169f341db84939f506eb8e87354c44da7af4a83b1851bea7edfe6698c1dbcc1c955e2aff44d87d70579ec1ca + languageName: node + linkType: hard + "electron-installer-redhat@npm:^3.2.0": version: 3.4.0 resolution: "electron-installer-redhat@npm:3.4.0" @@ -5940,9 +6802,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.668": - version: 1.4.680 - resolution: "electron-to-chromium@npm:1.4.680" - checksum: 10c0/f5877042ee84fce419b1c475ca1f75d1c19c0ecf358572635dffed97d8591a25c169ee1b5abfb8a14d741c699fcc4a92b1ef1f771fbd7887f3a18499a8eaf260 + version: 1.4.689 + resolution: "electron-to-chromium@npm:1.4.689" + checksum: 10c0/07164698a7ca6f798eba0fefccc3987be98e996ff50af1d2b24a75d53bc5e5cd101e79bca1d5e66b3c87be3f549c66b89deaf6c19a9dbef0eb9a8e3f8d15d3f5 languageName: node linkType: hard @@ -5959,16 +6821,16 @@ __metadata: languageName: node linkType: hard -"electron@npm:^29.0.1": - version: 29.0.1 - resolution: "electron@npm:29.0.1" +"electron@npm:^29.1.0": + version: 29.1.0 + resolution: "electron@npm:29.1.0" dependencies: "@electron/get": "npm:^2.0.0" "@types/node": "npm:^20.9.0" extract-zip: "npm:^2.0.1" bin: electron: cli.js - checksum: 10c0/828845b89ce8f759a38c85b7183b76ee9ef250ca6b87714dc44ede82fe6bb9f48ceb1418ed9a9ef640ec9aaa7431669a956915681808ee50a5731b8e84dcd6cd + checksum: 10c0/6b9946f10866544e088176ba14ffd37b79058a1b79ea0fd582df60f9d35808727c9200a0dc78210364491073ad648e11eabd3ac745d8c81c0ef71547ee0df96b languageName: node linkType: hard @@ -5993,6 +6855,13 @@ __metadata: languageName: node linkType: hard +"encode-utf8@npm:^1.0.3": + version: 1.0.3 + resolution: "encode-utf8@npm:1.0.3" + checksum: 10c0/6b3458b73e868113d31099d7508514a5c627d8e16d1e0542d1b4e3652299b8f1f590c468e2b9dcdf1b4021ee961f31839d0be9d70a7f2a8a043c63b63c9b3a88 + languageName: node + linkType: hard + "encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -6019,15 +6888,23 @@ __metadata: linkType: hard "enhanced-resolve@npm:^5.12.0": - version: 5.15.0 - resolution: "enhanced-resolve@npm:5.15.0" + version: 5.15.1 + resolution: "enhanced-resolve@npm:5.15.1" dependencies: graceful-fs: "npm:^4.2.4" tapable: "npm:^2.2.0" - checksum: 10c0/69984a7990913948b4150855aed26a84afb4cb1c5a94fb8e3a65bd00729a73fc2eaff6871fb8e345377f294831afe349615c93560f2f54d61b43cdfdf668f19a + checksum: 10c0/f56a0f3726dc5fb65cb4518ab0806aecfd553f4cd4146f403ffe618ece36610443d8624a89d18fe0bb0be307b1c9ca8fb835267345ca4afc25d2932d58ced715 languageName: node linkType: hard +"enjoy-docs@workspace:enjoy-docs": + version: 0.0.0-use.local + resolution: "enjoy-docs@workspace:enjoy-docs" + dependencies: + vitepress: "npm:^1.0.0-rc.44" + languageName: unknown + linkType: soft + "enjoy@workspace:enjoy": version: 0.0.0-use.local resolution: "enjoy@workspace:enjoy" @@ -6035,6 +6912,7 @@ __metadata: "@andrkrn/ffprobe-static": "npm:^5.2.0" "@electron-forge/cli": "npm:^7.3.0" "@electron-forge/maker-deb": "npm:^7.3.0" + "@electron-forge/maker-dmg": "npm:^7.3.0" "@electron-forge/maker-rpm": "npm:^7.3.0" "@electron-forge/maker-squirrel": "npm:^7.3.0" "@electron-forge/maker-zip": "npm:^7.3.0" @@ -6049,7 +6927,7 @@ __metadata: "@langchain/community": "npm:^0.0.32" "@langchain/google-genai": "npm:^0.0.10" "@mozilla/readability": "npm:^0.5.0" - "@playwright/test": "npm:^1.41.2" + "@playwright/test": "npm:^1.42.0" "@radix-ui/react-accordion": "npm:^1.1.2" "@radix-ui/react-alert-dialog": "npm:^1.0.5" "@radix-ui/react-aspect-ratio": "npm:^1.0.3" @@ -6081,15 +6959,15 @@ __metadata: "@types/intl-tel-input": "npm:^18.1.4" "@types/lodash": "npm:^4.14.202" "@types/mark.js": "npm:^8.11.12" - "@types/node": "npm:^20.11.19" - "@types/react": "npm:^18.2.57" + "@types/node": "npm:^20.11.24" + "@types/react": "npm:^18.2.61" "@types/react-dom": "npm:^18.2.19" "@types/validator": "npm:^13.11.9" "@types/wavesurfer.js": "npm:^6.0.12" - "@typescript-eslint/eslint-plugin": "npm:^7.0.2" - "@typescript-eslint/parser": "npm:^7.0.2" + "@typescript-eslint/eslint-plugin": "npm:^7.1.0" + "@typescript-eslint/parser": "npm:^7.1.0" "@uidotdev/usehooks": "npm:^2.4.1" - "@vidstack/react": "npm:^1.10.9" + "@vidstack/react": "npm:^0.6.14" "@vitejs/plugin-react": "npm:^4.2.1" autoprefixer: "npm:^10.4.17" autosize: "npm:^6.0.1" @@ -6106,12 +6984,12 @@ __metadata: dayjs: "npm:^1.11.10" decamelize: "npm:^6.0.0" decamelize-keys: "npm:^2.0.1" - electron: "npm:^29.0.1" + electron: "npm:^29.1.0" electron-log: "npm:^5.1.1" electron-playwright-helpers: "npm:^1.7.1" electron-settings: "npm:^4.0.2" electron-squirrel-startup: "npm:^1.0.0" - eslint: "npm:^8.56.0" + eslint: "npm:^8.57.0" eslint-import-resolver-typescript: "npm:^3.6.1" eslint-plugin-import: "npm:^2.29.1" ffmpeg-static: "npm:^5.2.0" @@ -6121,11 +6999,11 @@ __metadata: html-to-text: "npm:^9.0.5" https-proxy-agent: "npm:^7.0.4" i18next: "npm:^23.10.0" - intl-tel-input: "npm:^19.2.20" + intl-tel-input: "npm:^19.5.4" js-md5: "npm:^0.8.3" langchain: "npm:^0.1.21" lodash: "npm:^4.17.21" - lucide-react: "npm:^0.336.0" + lucide-react: "npm:^0.344.0" mark.js: "npm:^8.11.1" microsoft-cognitiveservices-speech-sdk: "npm:^1.35.0" next-themes: "npm:^0.2.1" @@ -6142,13 +7020,13 @@ __metadata: react-hotkeys-hook: "npm:^4.5.0" react-i18next: "npm:^14.0.5" react-markdown: "npm:^9.0.1" - react-router-dom: "npm:^6.22.1" + react-router-dom: "npm:^6.22.2" react-tooltip: "npm:^5.26.3" reflect-metadata: "npm:^0.2.1" rimraf: "npm:^5.0.5" sequelize: "npm:^6.37.1" sequelize-typescript: "npm:^2.1.6" - sonner: "npm:^1.4.0" + sonner: "npm:^1.4.3" sqlite3: "npm:^5.1.7" tailwind-merge: "npm:^2.2.1" tailwind-scrollbar-hide: "npm:^1.1.7" @@ -6166,7 +7044,7 @@ __metadata: languageName: unknown linkType: soft -"entities@npm:^4.2.0, entities@npm:^4.4.0": +"entities@npm:^4.2.0, entities@npm:^4.4.0, entities@npm:^4.5.0": version: 4.5.0 resolution: "entities@npm:4.5.0" checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 @@ -6197,16 +7075,16 @@ __metadata: linkType: hard "es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3": - version: 1.22.4 - resolution: "es-abstract@npm:1.22.4" + version: 1.22.5 + resolution: "es-abstract@npm:1.22.5" dependencies: array-buffer-byte-length: "npm:^1.0.1" arraybuffer.prototype.slice: "npm:^1.0.3" - available-typed-arrays: "npm:^1.0.6" + available-typed-arrays: "npm:^1.0.7" call-bind: "npm:^1.0.7" es-define-property: "npm:^1.0.0" es-errors: "npm:^1.3.0" - es-set-tostringtag: "npm:^2.0.2" + es-set-tostringtag: "npm:^2.0.3" es-to-primitive: "npm:^1.2.1" function.prototype.name: "npm:^1.1.6" get-intrinsic: "npm:^1.2.4" @@ -6214,15 +7092,15 @@ __metadata: globalthis: "npm:^1.0.3" gopd: "npm:^1.0.1" has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.0.1" + has-proto: "npm:^1.0.3" has-symbols: "npm:^1.0.3" hasown: "npm:^2.0.1" internal-slot: "npm:^1.0.7" is-array-buffer: "npm:^3.0.4" is-callable: "npm:^1.2.7" - is-negative-zero: "npm:^2.0.2" + is-negative-zero: "npm:^2.0.3" is-regex: "npm:^1.1.4" - is-shared-array-buffer: "npm:^1.0.2" + is-shared-array-buffer: "npm:^1.0.3" is-string: "npm:^1.0.7" is-typed-array: "npm:^1.1.13" is-weakref: "npm:^1.0.2" @@ -6235,13 +7113,13 @@ __metadata: string.prototype.trim: "npm:^1.2.8" string.prototype.trimend: "npm:^1.0.7" string.prototype.trimstart: "npm:^1.0.7" - typed-array-buffer: "npm:^1.0.1" - typed-array-byte-length: "npm:^1.0.0" - typed-array-byte-offset: "npm:^1.0.0" - typed-array-length: "npm:^1.0.4" + typed-array-buffer: "npm:^1.0.2" + typed-array-byte-length: "npm:^1.0.1" + typed-array-byte-offset: "npm:^1.0.2" + typed-array-length: "npm:^1.0.5" unbox-primitive: "npm:^1.0.2" which-typed-array: "npm:^1.1.14" - checksum: 10c0/dc332c3a010c5e7b77b7ea8a4532ac455fa02e7bcabf996a47447165bafa72d0d99967407d0cf5dbbb5fbbf87f53cd8b706608ec70953523b8cd2b831b9a9d64 + checksum: 10c0/4bca5a60f0dff6c0a5690d8e51374cfcb8760d5dbbb1069174b4d41461cf4e0c3e0c1993bccbc5aa0799ff078199f1bcde2122b8709e0d17c2beffafff01010a languageName: node linkType: hard @@ -6268,7 +7146,7 @@ __metadata: languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.2": +"es-set-tostringtag@npm:^2.0.3": version: 2.0.3 resolution: "es-set-tostringtag@npm:2.0.3" dependencies: @@ -6306,7 +7184,7 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.19.11, esbuild@npm:^0.19.3": +"esbuild@npm:^0.19.3": version: 0.19.12 resolution: "esbuild@npm:0.19.12" dependencies: @@ -6462,14 +7340,14 @@ __metadata: linkType: hard "eslint-module-utils@npm:^2.7.4, eslint-module-utils@npm:^2.8.0": - version: 2.8.0 - resolution: "eslint-module-utils@npm:2.8.0" + version: 2.8.1 + resolution: "eslint-module-utils@npm:2.8.1" dependencies: debug: "npm:^3.2.7" peerDependenciesMeta: eslint: optional: true - checksum: 10c0/c7a8d1a58d76ec8217a8fea49271ec8132d1b9390965a75f6a4ecbc9e5983d742195b46d2e4378231d2186801439fe1aa5700714b0bfd4eb17aac6e1b65309df + checksum: 10c0/1aeeb97bf4b688d28de136ee57c824480c37691b40fa825c711a4caf85954e94b99c06ac639d7f1f6c1d69223bd21bcb991155b3e589488e958d5b83dfd0f882 languageName: node linkType: hard @@ -6517,15 +7395,15 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.56.0": - version: 8.56.0 - resolution: "eslint@npm:8.56.0" +"eslint@npm:^8.57.0": + version: 8.57.0 + resolution: "eslint@npm:8.57.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.6.1" "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.56.0" - "@humanwhocodes/config-array": "npm:^0.11.13" + "@eslint/js": "npm:8.57.0" + "@humanwhocodes/config-array": "npm:^0.11.14" "@humanwhocodes/module-importer": "npm:^1.0.1" "@nodelib/fs.walk": "npm:^1.2.8" "@ungap/structured-clone": "npm:^1.2.0" @@ -6561,7 +7439,7 @@ __metadata: text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: 10c0/2be598f7da1339d045ad933ffd3d4742bee610515cd2b0d9a2b8b729395a01d4e913552fff555b559fccaefd89d7b37632825789d1b06470608737ae69ab43fb + checksum: 10c0/00bb96fd2471039a312435a6776fe1fd557c056755eaa2b96093ef3a8508c92c8775d5f754768be6b1dddd09fdd3379ddb231eeb9b6c579ee17ea7d68000a529 languageName: node linkType: hard @@ -6618,6 +7496,13 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -6718,12 +7603,12 @@ __metadata: linkType: hard "express@npm:^4.17.1": - version: 4.18.2 - resolution: "express@npm:4.18.2" + version: 4.18.3 + resolution: "express@npm:4.18.3" dependencies: accepts: "npm:~1.3.8" array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.1" + body-parser: "npm:1.20.2" content-disposition: "npm:0.5.4" content-type: "npm:~1.0.4" cookie: "npm:0.5.0" @@ -6752,7 +7637,7 @@ __metadata: type-is: "npm:~1.6.18" utils-merge: "npm:1.0.1" vary: "npm:~1.1.2" - checksum: 10c0/75af556306b9241bc1d7bdd40c9744b516c38ce50ae3210658efcbf96e3aed4ab83b3432f06215eae5610c123bc4136957dc06e50dfc50b7d4d775af56c4c59c + checksum: 10c0/0b9eeafbac549e3c67d92d083bf1773e358359f41ad142b92121935c6348d29079b75054555b3f62de39263fffc8ba06898b09fdd3e213e28e714c03c5d9f44c languageName: node linkType: hard @@ -6988,6 +7873,24 @@ __metadata: languageName: node linkType: hard +"fmix@npm:^0.1.0": + version: 0.1.0 + resolution: "fmix@npm:0.1.0" + dependencies: + imul: "npm:^1.0.0" + checksum: 10c0/af9e54eacc00b46e1c4a77229840e37252fff7634f81026591da9d24438ca15a1afa2786f579eb7865489ded21b76af7327d111b90b944e7409cd60f4d4f2ded + languageName: node + linkType: hard + +"focus-trap@npm:^7.5.4": + version: 7.5.4 + resolution: "focus-trap@npm:7.5.4" + dependencies: + tabbable: "npm:^6.2.0" + checksum: 10c0/c09e12b957862b2608977ff90de782645f99c3555cc5d93977240c179befa8723b9b1183e93890b4ad9d364d52a1af36416e63a728522ecce656a447d9ddd945 + languageName: node + linkType: hard + "follow-redirects@npm:^1.15.4": version: 1.15.5 resolution: "follow-redirects@npm:1.15.5" @@ -7163,6 +8066,24 @@ __metadata: languageName: node linkType: hard +"fs-temp@npm:^1.0.0": + version: 1.2.1 + resolution: "fs-temp@npm:1.2.1" + dependencies: + random-path: "npm:^0.1.0" + checksum: 10c0/d1487c2a6bb28d89c185d7f4c216c4bda61f6804dde4a92a364c5e0bff7e37cc3a3ddcaa3ee9ed3fa1ca3dfe7a5615e3294f25a8811211b8834fc3778aa92b89 + languageName: node + linkType: hard + +"fs-xattr@npm:^0.3.0": + version: 0.3.1 + resolution: "fs-xattr@npm:0.3.1" + dependencies: + node-gyp: "npm:latest" + conditions: "!os=win32" + languageName: node + linkType: hard + "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" @@ -7277,6 +8198,24 @@ __metadata: languageName: node linkType: hard +"generate-function@npm:^2.0.0": + version: 2.3.1 + resolution: "generate-function@npm:2.3.1" + dependencies: + is-property: "npm:^1.0.2" + checksum: 10c0/4645cf1da90375e46a6f1dc51abc9933e5eafa4cd1a44c2f7e3909a30a4e9a1a08c14cd7d5b32da039da2dba2a085e1ed4597b580c196c3245b2d35d8bc0de5d + languageName: node + linkType: hard + +"generate-object-property@npm:^1.1.0": + version: 1.2.0 + resolution: "generate-object-property@npm:1.2.0" + dependencies: + is-property: "npm:^1.0.0" + checksum: 10c0/0b30acb43283a489b1adf4655f3f413b448dbec750678cf70bfde92b04a22f85b286be004b66fd713e3060e418d7beb562f05431235ec95c044b63e324759e8c + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -7724,6 +8663,13 @@ __metadata: languageName: node linkType: hard +"hookable@npm:^5.5.3": + version: 5.5.3 + resolution: "hookable@npm:5.5.3" + checksum: 10c0/275f4cc84d27f8d48c5a5cd5685b6c0fea9291be9deea5bff0cfa72856ed566abde1dcd8cb1da0f9a70b4da3d7ec0d60dc3554c4edbba647058cc38816eced3d + languageName: node + linkType: hard + "hosted-git-info@npm:^2.1.4": version: 2.8.9 resolution: "hosted-git-info@npm:2.8.9" @@ -7923,6 +8869,15 @@ __metadata: languageName: node linkType: hard +"image-size@npm:^0.7.4": + version: 0.7.5 + resolution: "image-size@npm:0.7.5" + bin: + image-size: bin/image-size.js + checksum: 10c0/74e978c525e7d777df145bc66cfc4a4a7aa56de8e5daead3a69b0872082dbe385deb4a3b80799810df9e34b2031467412ae28810f2f65ec2e5fe08b895aa3491 + languageName: node + linkType: hard + "import-fresh@npm:^3.2.1": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" @@ -7940,6 +8895,13 @@ __metadata: languageName: node linkType: hard +"imul@npm:^1.0.0": + version: 1.0.1 + resolution: "imul@npm:1.0.1" + checksum: 10c0/d564c45a5017f01f965509ef409fad8175749bc96a52a95e1a09f05378d135fb37051cea7194d0eeca5147541d8e80d68853f5f681eef05f9f14f1d551edae2f + languageName: node + linkType: hard + "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -8017,15 +8979,14 @@ __metadata: languageName: node linkType: hard -"intl-tel-input@npm:^19.2.20": - version: 19.3.0 - resolution: "intl-tel-input@npm:19.3.0" +"intl-tel-input@npm:^19.5.4": + version: 19.5.4 + resolution: "intl-tel-input@npm:19.5.4" dependencies: - esbuild: "npm:^0.19.11" prop-types: "npm:^15.8.1" react: "npm:^18.2.0" react-dom: "npm:^18.2.0" - checksum: 10c0/e6b6ee00e42513b3550838b49ddef38bd09c66aa39d451b4a0496a4f60ff4d49bc3eb75caeb7aeb50b08240556b2cc747f9e937cb6bfd3b50a14c1e8322c3407 + checksum: 10c0/c393f0090cfbfc2014eab335b02b5f18dd6719a7d10383f9898a2361b8b98e2cc35ee8a1f2444571d98413b39694a0a13319365a0f374f23fb9e1705bd636e71 languageName: node linkType: hard @@ -8216,7 +9177,27 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.2": +"is-my-ip-valid@npm:^1.0.0": + version: 1.0.1 + resolution: "is-my-ip-valid@npm:1.0.1" + checksum: 10c0/61bc2dac50aa664b9fc9edb7aa7a68363a554dea2432e09766b6b860fcda5fc60aad6d47d273be635511346c4c4964dc1f3f96f8c8db02f1e380ad9992d67cca + languageName: node + linkType: hard + +"is-my-json-valid@npm:^2.20.0": + version: 2.20.6 + resolution: "is-my-json-valid@npm:2.20.6" + dependencies: + generate-function: "npm:^2.0.0" + generate-object-property: "npm:^1.1.0" + is-my-ip-valid: "npm:^1.0.0" + jsonpointer: "npm:^5.0.0" + xtend: "npm:^4.0.0" + checksum: 10c0/1f74c24db02b3ee9dc7042f828b4fb204566350d72b01ca1efa8a61e8c41fab8ef664dfeb1158c11de29a3ca87ac2645b9829e50116205919a1da91b7039d041 + languageName: node + linkType: hard + +"is-negative-zero@npm:^2.0.3": version: 2.0.3 resolution: "is-negative-zero@npm:2.0.3" checksum: 10c0/bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e @@ -8260,6 +9241,13 @@ __metadata: languageName: node linkType: hard +"is-property@npm:^1.0.0, is-property@npm:^1.0.2": + version: 1.0.2 + resolution: "is-property@npm:1.0.2" + checksum: 10c0/33ab65a136e4ba3f74d4f7d9d2a013f1bd207082e11cedb160698e8d5394644e873c39668d112a402175ccbc58a087cef87198ed46829dbddb479115a0257283 + languageName: node + linkType: hard + "is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" @@ -8270,7 +9258,7 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2": +"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": version: 1.0.3 resolution: "is-shared-array-buffer@npm:1.0.3" dependencies: @@ -8539,7 +9527,7 @@ __metadata: languageName: node linkType: hard -"jsonpointer@npm:^5.0.1": +"jsonpointer@npm:^5.0.0, jsonpointer@npm:^5.0.1": version: 5.0.1 resolution: "jsonpointer@npm:5.0.1" checksum: 10c0/89929e58b400fcb96928c0504fcf4fc3f919d81e9543ceb055df125538470ee25290bb4984251e172e6ef8fcc55761eb998c118da763a82051ad89d4cb073fe7 @@ -8602,12 +9590,12 @@ __metadata: linkType: hard "langchain@npm:^0.1.21": - version: 0.1.21 - resolution: "langchain@npm:0.1.21" + version: 0.1.24 + resolution: "langchain@npm:0.1.24" dependencies: "@anthropic-ai/sdk": "npm:^0.9.1" - "@langchain/community": "npm:~0.0.32" - "@langchain/core": "npm:~0.1.32" + "@langchain/community": "npm:~0.0.33" + "@langchain/core": "npm:~0.1.36" "@langchain/openai": "npm:~0.0.14" binary-extensions: "npm:^2.2.0" expr-eval: "npm:^2.0.2" @@ -8615,7 +9603,7 @@ __metadata: js-yaml: "npm:^4.1.0" jsonpointer: "npm:^5.0.1" langchainhub: "npm:~0.0.8" - langsmith: "npm:~0.1.1" + langsmith: "npm:~0.1.7" ml-distance: "npm:^4.0.0" openapi-types: "npm:^12.1.3" p-retry: "npm:4" @@ -8777,7 +9765,7 @@ __metadata: optional: true youtubei.js: optional: true - checksum: 10c0/fc522d4918968ef42c63b95f7e39acd4e2c0e3ded6c177d61265c2f152ebb4dbc1830e16c511c795fba2dd645989443dbaf381259ef474d5ed41201166a73378 + checksum: 10c0/6ad73bd80cbffbc33fa863b3e10fd7ec788832cbab1a15eb4aa8f680241235f0463577d09dc6bb63995bc4bc2c18f22391c02d9c2cb963890f9b84c4cb621722 languageName: node linkType: hard @@ -8788,9 +9776,9 @@ __metadata: languageName: node linkType: hard -"langsmith@npm:~0.1.1": - version: 0.1.5 - resolution: "langsmith@npm:0.1.5" +"langsmith@npm:~0.1.1, langsmith@npm:~0.1.7": + version: 0.1.8 + resolution: "langsmith@npm:0.1.8" dependencies: "@types/uuid": "npm:^9.0.1" commander: "npm:^10.0.1" @@ -8799,7 +9787,7 @@ __metadata: uuid: "npm:^9.0.0" bin: langsmith: dist/cli/main.cjs - checksum: 10c0/c93b9455183ec0d8544de03b69fc3ee469341ca2517333bff0edb8ac52ba8807a6dae0d426bf0bf6a6193f5731dafe5b2833ebaaf3c75f39cc2ef3eb66c9724a + checksum: 10c0/6cb82e6e9a3f72ff09e815a630e872915c85253505739fc94b2d34b1d37f9398f33734a4c2226691138a015a17a2d05dcc503fa9ae4723afa9ff4e80b5058616 languageName: node linkType: hard @@ -9112,12 +10100,31 @@ __metadata: languageName: node linkType: hard -"lucide-react@npm:^0.336.0": - version: 0.336.0 - resolution: "lucide-react@npm:0.336.0" +"lucide-react@npm:^0.344.0": + version: 0.344.0 + resolution: "lucide-react@npm:0.344.0" peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 - checksum: 10c0/d0416a9fe1d90461d9797b2aadb34d4dcdd26ec708e685e2500d0cff868de3acfe067bb595ac964aa40b1fc422746f2dc51d4cd5c0ceaa601ccfd4df9a5d5e1e + checksum: 10c0/f54c715459c190aab0fad8df2f76e06a6bf5be1b37d5d13f0ecfb2133dccda763b8b03b40463075fc93b2a754ad1b8d85adf3b880bf6da5f791dd17fcb788a37 + languageName: node + linkType: hard + +"macos-alias@npm:~0.2.5": + version: 0.2.11 + resolution: "macos-alias@npm:0.2.11" + dependencies: + nan: "npm:^2.4.0" + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"magic-string@npm:^0.30.7": + version: 0.30.7 + resolution: "magic-string@npm:0.30.7" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.4.15" + checksum: 10c0/d1d949f7a53c37c6e685f4ea7b2b151c2fe0cc5af8f1f979ecba916f7d60d58f35309aaf4c8b09ce1aef7c160b957be39a38b52b478a91650750931e4ddd5daf languageName: node linkType: hard @@ -9225,7 +10232,7 @@ __metadata: languageName: node linkType: hard -"mark.js@npm:^8.11.1": +"mark.js@npm:8.11.1, mark.js@npm:^8.11.1": version: 8.11.1 resolution: "mark.js@npm:8.11.1" checksum: 10c0/5e69e776db61abdd857b5cbb7070c8a3b1b0e5c12bf077fcd5a8c6f17b1f85ed65275aba5662b57136d1b9f82b54bb34d4ef4220f7703c9a7ab806ae1e208cff @@ -9373,13 +10380,6 @@ __metadata: languageName: node linkType: hard -"media-captions@npm:^1.0.1": - version: 1.0.2 - resolution: "media-captions@npm:1.0.2" - checksum: 10c0/4154e5c9b867cba19cecc2857d2aef712c3db6313b3a836a24096153cdc4a3a1500d7ce41050af9db2166e7bf2ba2790c57d6ddf9cd387da398a2ebf3c7fc2d8 - languageName: node - linkType: hard - "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -9752,7 +10752,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.8": +"minimist@npm:^1.1.1, minimist@npm:^1.1.3, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 @@ -9872,6 +10872,13 @@ __metadata: languageName: node linkType: hard +"minisearch@npm:^6.3.0": + version: 6.3.0 + resolution: "minisearch@npm:6.3.0" + checksum: 10c0/82799e1ff7be856f3ba0c13b237f4e56f0bf4fabf973b7f163e6a4be2604fe577776ef9dd50dde2a8ee54c74a7525008246f728e9ce0412477a5f18040d4a036 + languageName: node + linkType: hard + "minizlib@npm:^2.0.0, minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": version: 2.1.2 resolution: "minizlib@npm:2.1.2" @@ -9882,6 +10889,13 @@ __metadata: languageName: node linkType: hard +"mitt@npm:^3.0.1": + version: 3.0.1 + resolution: "mitt@npm:3.0.1" + checksum: 10c0/3ab4fdecf3be8c5255536faa07064d05caa3dd332bd318ff02e04621f7b3069ca1de9106cfe8e7ced675abfc2bec2ce4c4ef321c4a1bb1fb29df8ae090741913 + languageName: node + linkType: hard + "mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": version: 0.5.3 resolution: "mkdirp-classic@npm:0.5.3" @@ -9992,6 +11006,17 @@ __metadata: languageName: node linkType: hard +"murmur-32@npm:^0.1.0 || ^0.2.0": + version: 0.2.0 + resolution: "murmur-32@npm:0.2.0" + dependencies: + encode-utf8: "npm:^1.0.3" + fmix: "npm:^0.1.0" + imul: "npm:^1.0.0" + checksum: 10c0/1f08bb39b1a2f12bd265a0591c8f9f822d6cb3c2099320bb0efa9945f4ede1d233e08e92d64c6db8f5763f1eebac1729cb4e9dda6dd94fa2c8cfd56a706825fe + languageName: node + linkType: hard + "mz@npm:^2.7.0": version: 2.7.0 resolution: "mz@npm:2.7.0" @@ -10003,6 +11028,15 @@ __metadata: languageName: node linkType: hard +"nan@npm:^2.4.0": + version: 2.18.0 + resolution: "nan@npm:2.18.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/9209d80134fdb98c0afe35c1372d2b930a0a8d3c52706cb5e4257a27e9845c375f7a8daedadadec8d6403ca2eebb3b37d362ff5d1ec03249462abf65fef2a148 + languageName: node + linkType: hard + "nanoid@npm:^3.3.7": version: 3.3.7 resolution: "nanoid@npm:3.3.7" @@ -10059,11 +11093,11 @@ __metadata: linkType: hard "node-abi@npm:^3.3.0, node-abi@npm:^3.45.0": - version: 3.55.0 - resolution: "node-abi@npm:3.55.0" + version: 3.56.0 + resolution: "node-abi@npm:3.56.0" dependencies: semver: "npm:^7.3.5" - checksum: 10c0/27c445bef911c72342c476570f0eaba5f153b0f21efdf3a087ea656592461aa8973df8a1c5b34b8961ab19c6d628636d5b41aa079610fdc3f20989f06f255077 + checksum: 10c0/1cdaee96ba3898905a9ad775dd88556478fcd73bbe815e575725209da37057d187fb96e7efb785e331f4b3725e9939014a69d2edd7bf6969fad73344e1fcaf2f languageName: node linkType: hard @@ -10409,8 +11443,8 @@ __metadata: linkType: hard "openai@npm:^4.26.0, openai@npm:^4.28.0": - version: 4.28.0 - resolution: "openai@npm:4.28.0" + version: 4.28.4 + resolution: "openai@npm:4.28.4" dependencies: "@types/node": "npm:^18.11.18" "@types/node-fetch": "npm:^2.6.4" @@ -10423,7 +11457,7 @@ __metadata: web-streams-polyfill: "npm:^3.2.1" bin: openai: bin/cli - checksum: 10c0/b40cd3cf553ea947dbc916f6416c10528116eb523cd5453e3c442f11d9514de228e54b90b5c9cca1af34cc296baa0bd29ccbc8078bf9bf0b74bb18860468509a + checksum: 10c0/be0cf2758abf39c1d4f4db30034da312c1a7651cc3b09b8ca9a67d5bc3dd74861612783ac775660c97af91f7afdd1dff34b0e359b41a8aec6afd8049bd578fc8 languageName: node linkType: hard @@ -10650,6 +11684,15 @@ __metadata: languageName: node linkType: hard +"parse-color@npm:^1.0.0": + version: 1.0.0 + resolution: "parse-color@npm:1.0.0" + dependencies: + color-convert: "npm:~0.5.0" + checksum: 10c0/53b864bd91f9e3134e8d05b834c42c9ece76c6c3426fe979c36fc0452cfd9c8cbe8c7497cd7ddd8436a5878cd43af982a5eaf85908f69a6de0fe3daf122b65f7 + languageName: node + linkType: hard + "parse-entities@npm:^4.0.0": version: 4.0.1 resolution: "parse-entities@npm:4.0.1" @@ -10816,6 +11859,13 @@ __metadata: languageName: node linkType: hard +"perfect-debounce@npm:^1.0.0": + version: 1.0.0 + resolution: "perfect-debounce@npm:1.0.0" + checksum: 10c0/e2baac416cae046ef1b270812cf9ccfb0f91c04ea36ac7f5b00bc84cb7f41bdbba087c0ab21b4e02a7ef3a1f1f6db399f137cecec46868bd7d8d88c2a9ee431f + languageName: node + linkType: hard + "pg-connection-string@npm:^2.6.1": version: 2.6.2 resolution: "pg-connection-string@npm:2.6.2" @@ -10867,27 +11917,27 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.41.2": - version: 1.41.2 - resolution: "playwright-core@npm:1.41.2" +"playwright-core@npm:1.42.0": + version: 1.42.0 + resolution: "playwright-core@npm:1.42.0" bin: playwright-core: cli.js - checksum: 10c0/1e80a24b0e93dd5aa643fb926d23c055f2c1a0a1e711c0d798edcfd8c3e46a6716d4ca59d72ed076191e6c713d09a0f14387d96e60f5221abd4ff65aef1ac3b3 + checksum: 10c0/f08700ec743734247a0e025249ccaf1f58beb95b5c8ef6a4319f636db83ea668222967ae10299114e9f4725318f80185c7c7d97fe051ebd617acec5ae67af31a languageName: node linkType: hard -"playwright@npm:1.41.2": - version: 1.41.2 - resolution: "playwright@npm:1.41.2" +"playwright@npm:1.42.0": + version: 1.42.0 + resolution: "playwright@npm:1.42.0" dependencies: fsevents: "npm:2.3.2" - playwright-core: "npm:1.41.2" + playwright-core: "npm:1.42.0" dependenciesMeta: fsevents: optional: true bin: playwright: cli.js - checksum: 10c0/1b487387c1bc003291a9dbd098e8e3c6a31efbb4d7a2ce4f2bf9d5e7f9fbf4a406352ab70e5266eab9a2a858bd42d8955343ea30c0286c3912e81984aa0220a3 + checksum: 10c0/4960431c89097d7a79a24d3d4e5896cd9e4253dacfdf2891ed8a32f31c6f665a3df9af636baa23a93382733667a4d997afadb6148e6ba71f42202eeafc8968b7 languageName: node linkType: hard @@ -11018,9 +12068,16 @@ __metadata: languageName: node linkType: hard +"preact@npm:^10.0.0": + version: 10.19.6 + resolution: "preact@npm:10.19.6" + checksum: 10c0/305c63bc59f9a081185fea8ee9a43c96f69af58e50692228d0e566eacd69bac009f2fb9d4ebfa2bcfcfd9762c5318a7f1ccd1d5223ab8764e3f7e14386bce626 + languageName: node + linkType: hard + "prebuild-install@npm:^7.1.1": - version: 7.1.1 - resolution: "prebuild-install@npm:7.1.1" + version: 7.1.2 + resolution: "prebuild-install@npm:7.1.2" dependencies: detect-libc: "npm:^2.0.0" expand-template: "npm:^2.0.3" @@ -11036,7 +12093,7 @@ __metadata: tunnel-agent: "npm:^0.6.0" bin: prebuild-install: bin.js - checksum: 10c0/6dc70f36b0f4adcb2fe0ed38d874ab28b571fb1a9725d769e8ba3f64a15831e58462de09f3e6e64569bcc4a3e03b9328b56faa0d45fe10ae1574478814536c76 + checksum: 10c0/e64868ba9ef2068fd7264f5b03e5298a901e02a450acdb1f56258d88c09dea601eefdb3d1dfdff8513fdd230a92961712be0676192626a3b4d01ba154d48bdd3 languageName: node linkType: hard @@ -11187,6 +12244,16 @@ __metadata: languageName: node linkType: hard +"random-path@npm:^0.1.0": + version: 0.1.2 + resolution: "random-path@npm:0.1.2" + dependencies: + base32-encode: "npm:^0.1.0 || ^1.0.0" + murmur-32: "npm:^0.1.0 || ^0.2.0" + checksum: 10c0/fc76b09553db9dd27980c770f2e72bc065044162cfae2d9f428fdd2f4f8cec238bf4e1193e62cf14988e8f756b3426b2c6a82b0203d9bd83e285bc1adf463a56 + languageName: node + linkType: hard + "range-parser@npm:~1.2.1": version: 1.2.1 resolution: "range-parser@npm:1.2.1" @@ -11194,15 +12261,15 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:2.5.1": - version: 2.5.1 - resolution: "raw-body@npm:2.5.1" +"raw-body@npm:2.5.2": + version: 2.5.2 + resolution: "raw-body@npm:2.5.2" dependencies: bytes: "npm:3.1.2" http-errors: "npm:2.0.0" iconv-lite: "npm:0.4.24" unpipe: "npm:1.0.0" - checksum: 10c0/5dad5a3a64a023b894ad7ab4e5c7c1ce34d3497fc7138d02f8c88a3781e68d8a55aa7d4fd3a458616fa8647cc228be314a1c03fb430a07521de78b32c4dd09d2 + checksum: 10c0/b201c4b66049369a60e766318caff5cb3cc5a900efd89bdac431463822d976ad0670912c931fdbdcf5543207daf6f6833bca57aa116e1661d2ea91e12ca692c4 languageName: node linkType: hard @@ -11362,27 +12429,27 @@ __metadata: languageName: node linkType: hard -"react-router-dom@npm:^6.22.1": - version: 6.22.1 - resolution: "react-router-dom@npm:6.22.1" +"react-router-dom@npm:^6.22.2": + version: 6.22.2 + resolution: "react-router-dom@npm:6.22.2" dependencies: - "@remix-run/router": "npm:1.15.1" - react-router: "npm:6.22.1" + "@remix-run/router": "npm:1.15.2" + react-router: "npm:6.22.2" peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: 10c0/1e6ec4596f134204934d4f701b8acc426867532342c8aec1b5c4ffeaf23afa0099727f58ab8687f7838db069616b8d6ed05a065570f23b3b60cbff405b3fbccd + checksum: 10c0/5dc5a54a72b0470cce571f95021516f1afbe978f9b5103a0f7de9e8585d2f5f8d084f810f3eb648b9701a941a17f3a68517b07a4827dfc4bdb5f0ff0c18920a8 languageName: node linkType: hard -"react-router@npm:6.22.1": - version: 6.22.1 - resolution: "react-router@npm:6.22.1" +"react-router@npm:6.22.2": + version: 6.22.2 + resolution: "react-router@npm:6.22.2" dependencies: - "@remix-run/router": "npm:1.15.1" + "@remix-run/router": "npm:1.15.2" peerDependencies: react: ">=16.8" - checksum: 10c0/bb33c3a6457e73fa9977133be0c27b60accfc6452cc5d7b62c729cdd2d091a1345a9567cf852c651315548f1f16adac258eeab8ad193b46e4ce926c911dc857c + checksum: 10c0/e0a0d1a0c8566b377cda632691a7c39d4009cbc8fced4fe06f13789a8acc38c474a366984b536b109e3685f3d7e1f839d6bec7b28fb96d311d86d02fc8999379 languageName: node linkType: hard @@ -11546,6 +12613,13 @@ __metadata: languageName: node linkType: hard +"repeat-string@npm:^1.5.4": + version: 1.6.1 + resolution: "repeat-string@npm:1.6.1" + checksum: 10c0/87fa21bfdb2fbdedc44b9a5b118b7c1239bdd2c2c1e42742ef9119b7d412a5137a1d23f1a83dc6bb686f4f27429ac6f542e3d923090b44181bafa41e8ac0174d + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -11666,14 +12740,14 @@ __metadata: languageName: node linkType: hard -"rfdc@npm:^1.3.0": +"rfdc@npm:^1.3.0, rfdc@npm:^1.3.1": version: 1.3.1 resolution: "rfdc@npm:1.3.1" checksum: 10c0/69f65e3ed30970f8055fac9fbbef9ce578800ca19554eab1dcbffe73a4b8aef536bc4248313889cf25e3b4e38b212c721eabe30856575bf2b2bc3d90f8ba93ef languageName: node linkType: hard -"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": +"rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" dependencies: @@ -12078,15 +13152,24 @@ __metadata: languageName: node linkType: hard +"shiki@npm:1.1.7, shiki@npm:^1.1.5": + version: 1.1.7 + resolution: "shiki@npm:1.1.7" + dependencies: + "@shikijs/core": "npm:1.1.7" + checksum: 10c0/536f8dec961d7938f6d3a63dd6be64be082b56c1433380eda0a82cb57b5789759097947d9ef1726e521d4054a6fe2b73639e94bedaccea2044fa640667167501 + languageName: node + linkType: hard + "side-channel@npm:^1.0.4": - version: 1.0.5 - resolution: "side-channel@npm:1.0.5" + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" dependencies: - call-bind: "npm:^1.0.6" + call-bind: "npm:^1.0.7" es-errors: "npm:^1.3.0" get-intrinsic: "npm:^1.2.4" object-inspect: "npm:^1.13.1" - checksum: 10c0/31312fecb68997ce2893b1f6d1fd07d6dd41e05cc938e82004f056f7de96dd9df599ef9418acdf730dda948e867e933114bd2efe4170c0146d1ed7009700c252 + checksum: 10c0/d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f languageName: node linkType: hard @@ -12199,22 +13282,22 @@ __metadata: linkType: hard "socks@npm:^2.6.2, socks@npm:^2.7.1": - version: 2.8.0 - resolution: "socks@npm:2.8.0" + version: 2.8.1 + resolution: "socks@npm:2.8.1" dependencies: ip-address: "npm:^9.0.5" smart-buffer: "npm:^4.2.0" - checksum: 10c0/208fa5d5ae47857653c4fc039d47e4c1e76313b24052151a949aa98f027f9aaba8fc6c5dc0f7f2d9ceeb94e9940217581f2d9798436563c1494b67a6cb68611f + checksum: 10c0/ac77b515c260473cc7c4452f09b20939e22510ce3ae48385c516d1d5784374d5cc75be3cb18ff66cc985a7f4f2ef8fef84e984c5ec70aad58355ed59241f40a8 languageName: node linkType: hard -"sonner@npm:^1.4.0": - version: 1.4.0 - resolution: "sonner@npm:1.4.0" +"sonner@npm:^1.4.3": + version: 1.4.3 + resolution: "sonner@npm:1.4.3" peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 10c0/2e55de2de03dd0d103d36d18e36a891b16e42102ca789a2eea37635172d7035dea749e95ff0e36cc04f1c43c9fa72637a17a702ef184926bf1c33ed17fba18bd + checksum: 10c0/d105a3195a5e72b85a13abc460da2cbb8a05133da57fd2f1084593edca5b6a839a7263a4e872952d9e550a19f2262fbc22113be30a4c9b3dee9e6d359a0cef34 languageName: node linkType: hard @@ -12283,6 +13366,13 @@ __metadata: languageName: node linkType: hard +"speakingurl@npm:^14.0.1": + version: 14.0.1 + resolution: "speakingurl@npm:14.0.1" + checksum: 10c0/1de1d1b938a7c4d9e79593ff7a26d312ec04a7c3234ca40b7f9b8106daf74ea9d2110a077f5db97ecf3762b83069e3ccbf9694431b51d4fcfd863f0b3333c342 + languageName: node + linkType: hard + "split@npm:0.3": version: 0.3.3 resolution: "split@npm:0.3.3" @@ -12361,6 +13451,13 @@ __metadata: languageName: node linkType: hard +"stream-buffers@npm:~2.2.0": + version: 2.2.0 + resolution: "stream-buffers@npm:2.2.0" + checksum: 10c0/14a351f0a066eaa08c8c64a74f4aedd87dd7a8e59d4be224703da33dca3eb370828ee6c0ae3fff59a9c743e8098728fc95c5f052ae7741672a31e6b1430ba50a + languageName: node + linkType: hard + "stream-combiner@npm:~0.0.4": version: 0.0.4 resolution: "stream-combiner@npm:0.0.4" @@ -12574,6 +13671,15 @@ __metadata: languageName: node linkType: hard +"supports-color@npm:~8.1.1": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 + languageName: node + linkType: hard + "supports-preserve-symlinks-flag@npm:^1.0.0": version: 1.0.0 resolution: "supports-preserve-symlinks-flag@npm:1.0.0" @@ -12581,6 +13687,13 @@ __metadata: languageName: node linkType: hard +"tabbable@npm:^6.2.0": + version: 6.2.0 + resolution: "tabbable@npm:6.2.0" + checksum: 10c0/ced8b38f05f2de62cd46836d77c2646c42b8c9713f5bd265daf0e78ff5ac73d3ba48a7ca45f348bafeef29b23da7187c72250742d37627883ef89cbd7fa76898 + languageName: node + linkType: hard + "tailwind-merge@npm:^2.2.1": version: 2.2.1 resolution: "tailwind-merge@npm:2.2.1" @@ -12744,11 +13857,25 @@ __metadata: linkType: hard "tmp@npm:^0.2.0": - version: 0.2.1 - resolution: "tmp@npm:0.2.1" + version: 0.2.3 + resolution: "tmp@npm:0.2.3" + checksum: 10c0/3e809d9c2f46817475b452725c2aaa5d11985cf18d32a7a970ff25b568438e2c076c2e8609224feef3b7923fa9749b74428e3e634f6b8e520c534eef2fd24125 + languageName: node + linkType: hard + +"tn1150@npm:^0.1.0": + version: 0.1.0 + resolution: "tn1150@npm:0.1.0" dependencies: - rimraf: "npm:^3.0.0" - checksum: 10c0/67607aa012059c9ce697bee820ee51bc0f39b29a8766def4f92d3f764d67c7cf9205d537d24e0cb1ce9685c40d4c628ead010910118ea18348666b5c46ed9123 + unorm: "npm:^1.4.1" + checksum: 10c0/5a07b2e9ecddca3bab11f75450800c74b99fec182be77f20c65ce22ae716c434bdf69c472aabb566e04d9574588fc99597e2983804ae0336ddb71d5e8c5ea4f0 + languageName: node + linkType: hard + +"to-data-view@npm:^1.1.0": + version: 1.1.0 + resolution: "to-data-view@npm:1.1.0" + checksum: 10c0/5dfff586ccb523c8de1c03567ef9a220dbf466f90c3265bf51247e3e69c3857b3fa1b31b77866c4a40ea6245dc4a5f9d5c077a29076c44cab31b97d768034baa languageName: node linkType: hard @@ -12948,7 +14075,7 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.1": +"typed-array-buffer@npm:^1.0.2": version: 1.0.2 resolution: "typed-array-buffer@npm:1.0.2" dependencies: @@ -12959,7 +14086,7 @@ __metadata: languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.0": +"typed-array-byte-length@npm:^1.0.1": version: 1.0.1 resolution: "typed-array-byte-length@npm:1.0.1" dependencies: @@ -12972,7 +14099,7 @@ __metadata: languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.0": +"typed-array-byte-offset@npm:^1.0.2": version: 1.0.2 resolution: "typed-array-byte-offset@npm:1.0.2" dependencies: @@ -12986,7 +14113,7 @@ __metadata: languageName: node linkType: hard -"typed-array-length@npm:^1.0.4": +"typed-array-length@npm:^1.0.5": version: 1.0.5 resolution: "typed-array-length@npm:1.0.5" dependencies: @@ -13226,6 +14353,13 @@ __metadata: languageName: node linkType: hard +"unorm@npm:^1.4.1": + version: 1.6.0 + resolution: "unorm@npm:1.6.0" + checksum: 10c0/ff0caa3292f318e2e832d02ad019a401118fe42f5e554dca3b9c7e4a2a3100eda051945711234a6ffbd74088cf51930755782456d30864240936cb3485f80a01 + languageName: node + linkType: hard + "unpipe@npm:1.0.0, unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" @@ -13395,7 +14529,7 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.1.4": +"vite@npm:^5.1.3, vite@npm:^5.1.4": version: 5.1.4 resolution: "vite@npm:5.1.4" dependencies: @@ -13435,6 +14569,39 @@ __metadata: languageName: node linkType: hard +"vitepress@npm:^1.0.0-rc.44": + version: 1.0.0-rc.44 + resolution: "vitepress@npm:1.0.0-rc.44" + dependencies: + "@docsearch/css": "npm:^3.5.2" + "@docsearch/js": "npm:^3.5.2" + "@shikijs/core": "npm:^1.1.5" + "@shikijs/transformers": "npm:^1.1.5" + "@types/markdown-it": "npm:^13.0.7" + "@vitejs/plugin-vue": "npm:^5.0.4" + "@vue/devtools-api": "npm:^7.0.14" + "@vueuse/core": "npm:^10.7.2" + "@vueuse/integrations": "npm:^10.7.2" + focus-trap: "npm:^7.5.4" + mark.js: "npm:8.11.1" + minisearch: "npm:^6.3.0" + shiki: "npm:^1.1.5" + vite: "npm:^5.1.3" + vue: "npm:^3.4.19" + peerDependencies: + markdown-it-mathjax3: ^4.3.2 + postcss: ^8.4.35 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + postcss: + optional: true + bin: + vitepress: bin/vitepress.js + checksum: 10c0/41df791d34d4ee2ad8a274ad951604d5d40cd6eec3983a62d7060bf3002aa68686438592207058c078373f5e3b51120d3c142857dcae086836791eb06e39076c + languageName: node + linkType: hard + "void-elements@npm:3.1.0": version: 3.1.0 resolution: "void-elements@npm:3.1.0" @@ -13442,6 +14609,40 @@ __metadata: languageName: node linkType: hard +"vue-demi@npm:>=0.14.7": + version: 0.14.7 + resolution: "vue-demi@npm:0.14.7" + peerDependencies: + "@vue/composition-api": ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + "@vue/composition-api": + optional: true + bin: + vue-demi-fix: bin/vue-demi-fix.js + vue-demi-switch: bin/vue-demi-switch.js + checksum: 10c0/303216e3e6ee3f6ab5631488dd00a767ef3760a0a14e580c0223b278d093dc9ada8164ecec6bf8d8e12034e0bdf8dbb947c0c6f83095c6a53030a4a6dcbd57ce + languageName: node + linkType: hard + +"vue@npm:^3.4.19": + version: 3.4.21 + resolution: "vue@npm:3.4.21" + dependencies: + "@vue/compiler-dom": "npm:3.4.21" + "@vue/compiler-sfc": "npm:3.4.21" + "@vue/runtime-dom": "npm:3.4.21" + "@vue/server-renderer": "npm:3.4.21" + "@vue/shared": "npm:3.4.21" + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/70806fdfe2f34387dd043403f3cf0946f43216090832c2a0be06e88d6feabba28a0aa05dc75777a1cb1aa770b24c015206519a20752faf0f6ed4d9b7568f0400 + languageName: node + linkType: hard + "wavesurfer.js@npm:^7.7.3": version: 7.7.3 resolution: "wavesurfer.js@npm:7.7.3" @@ -13667,6 +14868,13 @@ __metadata: languageName: node linkType: hard +"xtend@npm:^4.0.0": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e + languageName: node + linkType: hard + "xterm-addon-fit@npm:^0.5.0": version: 0.5.0 resolution: "xterm-addon-fit@npm:0.5.0" @@ -13714,9 +14922,11 @@ __metadata: linkType: hard "yaml@npm:^2.2.1, yaml@npm:^2.2.2, yaml@npm:^2.3.4": - version: 2.3.4 - resolution: "yaml@npm:2.3.4" - checksum: 10c0/cf03b68f8fef5e8516b0f0b54edaf2459f1648317fc6210391cf606d247e678b449382f4bd01f77392538429e306c7cba8ff46ff6b37cac4de9a76aff33bd9e1 + version: 2.4.0 + resolution: "yaml@npm:2.4.0" + bin: + yaml: bin.mjs + checksum: 10c0/97ab0b5a0714c92e4dd75120a6a63e470b0adc282afae0a701bf38f8c42cbf6429fcd6aca883e3a63c68936ab841862e6c69e2d66d355c3e4fc7cfd346af2108 languageName: node linkType: hard