mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
Compare commits
1 Commits
staging
...
img-swipe-
Author | SHA1 | Date | |
---|---|---|---|
|
20ab6193ab |
@@ -13,4 +13,3 @@ access.log
|
||||
/cache
|
||||
.DS_Store
|
||||
/public/scripts/extensions/third-party
|
||||
/colab
|
||||
|
@@ -3,9 +3,6 @@ module.exports = {
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
],
|
||||
plugins: [
|
||||
'jsdoc',
|
||||
],
|
||||
env: {
|
||||
es6: true,
|
||||
},
|
||||
@@ -81,7 +78,6 @@ module.exports = {
|
||||
'public/scripts/extensions/tts/lib/**',
|
||||
],
|
||||
rules: {
|
||||
'jsdoc/no-undefined-types': ['warn', { disableReporting: true, markVariablesAsUsed: true }],
|
||||
'no-unused-vars': ['error', { args: 'none' }],
|
||||
'no-control-regex': 'off',
|
||||
'no-constant-condition': ['error', { checkLoops: false }],
|
||||
|
4
.github/issues-auto-labels.yml
vendored
4
.github/issues-auto-labels.yml
vendored
@@ -14,7 +14,7 @@
|
||||
- '(🐧 Linux)'
|
||||
|
||||
🦊 Firefox:
|
||||
- '\b(firefox|mozilla)\b'
|
||||
- '(firefox|mozilla)'
|
||||
|
||||
📱 Mobile:
|
||||
- '\b(iphone|ios|android|📱 Termux)\b'
|
||||
- '(iphone|ios|android|📱 Termux)'
|
||||
|
6
.github/pr-auto-labels-by-branch.yml
vendored
6
.github/pr-auto-labels-by-branch.yml
vendored
@@ -34,9 +34,6 @@
|
||||
🦊 Firefox:
|
||||
- head-branch: ['\bfirefox\b']
|
||||
|
||||
🧑🤝🧑 Group Chat:
|
||||
- head-branch: ['\bgroups?\b']
|
||||
|
||||
🖼️ Image Gen:
|
||||
- head-branch: ['\bimage-gen\b']
|
||||
|
||||
@@ -61,9 +58,6 @@
|
||||
📜 Prompt:
|
||||
- head-branch: ['\bprompt\b']
|
||||
|
||||
🧠 Reasoning:
|
||||
- head-branch: ['\breasoning\b', '\breason\b', '\bthinking\b']
|
||||
|
||||
🚚 Refactor:
|
||||
- head-branch: ['\brefactor(s|ed)?\b']
|
||||
|
||||
|
85
.github/readme.md
vendored
85
.github/readme.md
vendored
@@ -7,7 +7,7 @@
|
||||
English | [German](readme-de_de.md) | [中文](readme-zh_cn.md) | [繁體中文](readme-zh_tw.md) | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) | [한국어](readme-ko_kr.md)
|
||||
|
||||
[](https://github.com/SillyTavern/SillyTavern/stargazers)
|
||||
[](https://github.com/SillyTavern/SillyTavern/forks)
|
||||
[](https://github.com/SillyTavern/SillyTavern/network)
|
||||
[](https://github.com/SillyTavern/SillyTavern/issues)
|
||||
[](https://github.com/SillyTavern/SillyTavern/pulls)
|
||||
|
||||
@@ -42,7 +42,7 @@ If you're not familiar with using the git CLI or don't understand what a branch
|
||||
|
||||
## What do I need other than SillyTavern?
|
||||
|
||||
Since SillyTavern is only an interface, you will need access to an LLM backend to provide inference. You can use AI Horde for instant out-of-the-box chatting. Aside from that, we support many other local and cloud-based LLM backends: OpenAI-compatible API, KoboldAI, Tabby, and many more. You can read more about our supported APIs in [the Docs](https://docs.sillytavern.app/usage/api-connections/).
|
||||
Since SillyTavern is only an interface, you will need access to an LLM backend to provide inference. You can use AI Horde for instant out-of-the-box chatting. Aside from that, we support many other local and cloud-based LLM backends: OpenAI-compatible API, KoboldAI, Tabby, and many more. You can read more about our supported APIs in [the FAQ](https://docs.sillytavern.app/usage/api-connections/).
|
||||
|
||||
### Do I need a powerful PC to run SillyTavern?
|
||||
|
||||
@@ -83,7 +83,9 @@ Or get in touch with the developers directly:
|
||||
|
||||
SillyTavern is built around the concept of "character cards". A character card is a collection of prompts that set the behavior of the LLM and is required to have persistent conversations in SillyTavern. They function similarly to ChatGPT's GPTs or Poe's bots. The content of a character card can be anything: an abstract scenario, an assistant tailored for a specific task, a famous personality or a fictional character.
|
||||
|
||||
To have a quick conversation without selecting a character card or to just test the LLM connection, simply type your prompt input into the input bar on the Welcome Screen after opening SillyTavern. This will create an empty "Assistant" character card that you can customize later.
|
||||
The name field is the only required character card input. To start a neutral conversation with the language model, create a new card simply called "Assistant" and leave the rest of the boxes blank. For a more themed chat, you can provide the language model with various background details, behavior and writing patterns, and a scenario to jump start the chat.
|
||||
|
||||
To have a quick conversation without selecting a character card or to just test the LLM connection, simply type your prompt input into the input bar on the Welcome Screen after opening SillyTavern. Please note that such chats are temporary and will not be saved.
|
||||
|
||||
To get a general idea on how to define character cards, see the default character (Seraphina) or download selected community-made cards from the "Download Extensions & Assets" menu.
|
||||
|
||||
@@ -190,43 +192,28 @@ You will need two mandatory directory mappings and a port mapping to allow Silly
|
||||
|
||||
##### Volume Mappings
|
||||
|
||||
* `CONFIG_PATH` - The directory where SillyTavern configuration files will be stored on your host machine
|
||||
* `DATA_PATH` - The directory where SillyTavern user data (including characters) will be stored on your host machine
|
||||
* `PLUGINS_PATH` - (optional) The directory where SillyTavern server plugins will be stored on your host machine
|
||||
* `EXTENSIONS_PATH` - (optional) The directory where global UI extensions will be stored on your host machine
|
||||
* [config] - The directory where SillyTavern configuration files will be stored on your host machine
|
||||
* [data] - The directory where SillyTavern user data (including characters) will be stored on your host machine
|
||||
* [plugins] - (optional) The directory where SillyTavern server plugins will be stored on your host machine
|
||||
* [extensions] - (optional) The directory where global UI extensions will be stored on your host machine
|
||||
|
||||
##### Port Mappings
|
||||
|
||||
* `PUBLIC_PORT` - The port to expose the traffic on. This is mandatory, as you will be accessing the instance from outside of its virtual machine container. DO NOT expose this to the internet without implementing a separate service for security.
|
||||
* [PublicPort] - The port to expose the traffic on. This is mandatory, as you will be accessing the instance from outside of its virtual machine container. DO NOT expose this to the internet without implementing a separate service for security.
|
||||
|
||||
##### Additional Settings
|
||||
|
||||
* `SILLYTAVERN_VERSION` - On the right-hand side of this GitHub page, you'll see "Packages". Select the "sillytavern" package and you'll see the image versions. The image tag "latest" will keep you up-to-date with the current release. You can also utilize "staging" that points to the nightly image of the respective branch.
|
||||
* [DockerNet] - The docker network that the container should be created with a connection to. If you don't know what it is, see the [official Docker documentation](https://docs.docker.com/reference/cli/docker/network/).
|
||||
* [version] - On the right-hand side of this GitHub page, you'll see "Packages". Select the "sillytavern" package and you'll see the image versions. The image tag "latest" will keep you up-to-date with the current release. You can also utilize "staging" and "release" tags that point to the nightly images of the respective branches, but this may not be appropriate, if you are utilizing extensions that could be broken, and may need time to update.
|
||||
|
||||
#### Running the container
|
||||
#### Install command
|
||||
|
||||
1. Open your Command Line
|
||||
2. Run the following command in a folder where you want to store the configuration and data files:
|
||||
2. Run the following command
|
||||
|
||||
```bash
|
||||
SILLYTAVERN_VERSION="latest"
|
||||
PUBLIC_PORT="8000"
|
||||
CONFIG_PATH="./config"
|
||||
DATA_PATH="./data"
|
||||
PLUGINS_PATH="./plugins"
|
||||
EXTENSIONS_PATH="./extensions"
|
||||
`docker run --name='sillytavern' --net='[DockerNet]' -p '8000:8000/tcp' -v '[plugins]':'/home/node/app/plugins':'rw' -v '[config]':'/home/node/app/config':'rw' -v '[data]':'/home/node/app/data':'rw' -v '[extensions]':'/home/node/app/public/scripts/extensions/third-party':'rw' 'ghcr.io/sillytavern/sillytavern:[version]'`
|
||||
|
||||
docker run \
|
||||
--name="sillytavern" \
|
||||
-p "$PUBLIC_PORT:8000/tcp" \
|
||||
-v "$CONFIG_PATH:/home/node/app/config:rw" \
|
||||
-v "$DATA_PATH:/home/node/app/data:rw" \
|
||||
-v "$EXTENSIONS_PATH:/home/node/app/public/scripts/extensions/third-party:rw" \
|
||||
-v "$PLUGINS_PATH:/home/node/app/plugins:rw" \
|
||||
ghcr.io/sillytavern/sillytavern:"$SILLYTAVERN_VERSION"
|
||||
```
|
||||
|
||||
> By default the container will run in the foreground. If you want to run it in the background, add the `-d` flag to the `docker run` command.
|
||||
> Note that 8000 is a default listening port. Don't forget to use an appropriate port if you change it in the config.
|
||||
|
||||
### Building the image yourself
|
||||
|
||||
@@ -314,6 +301,18 @@ chmod +x launcher.sh && ./launcher.sh
|
||||
|
||||
**Unsupported platform: android arm LEtime-web.** 32-bit Android requires an external dependency that can't be installed with npm. Use the following command to install it: `pkg install esbuild`. Then run the usual installation steps.
|
||||
|
||||
## API keys management
|
||||
|
||||
SillyTavern saves your API keys to a `secrets.json` file in the user data directory (`/data/default-user/secrets.json` is the default path).
|
||||
|
||||
By default, API keys will not be visible from the interface after you have saved them and refreshed the page.
|
||||
|
||||
In order to enable viewing your keys:
|
||||
|
||||
1. Set the value of `allowKeysExposure` to `true` in `config.yaml` file.
|
||||
2. Restart the SillyTavern server.
|
||||
3. Click the 'View hidden API keys' link at the bottom right of the API Connection Panel.
|
||||
|
||||
## Command-line arguments
|
||||
|
||||
You can pass command-line arguments to SillyTavern server startup to override some settings in `config.yaml`.
|
||||
@@ -336,7 +335,6 @@ Start.bat --port 8000 --listen false
|
||||
| Option | Description | Type |
|
||||
|-------------------------|----------------------------------------------------------------------|----------|
|
||||
| `--version` | Show version number | boolean |
|
||||
| `--configPath` | Override the path to the config.yaml file | string |
|
||||
| `--dataRoot` | Root directory for data storage | string |
|
||||
| `--port` | Sets the port under which SillyTavern will run | number |
|
||||
| `--listen` | SillyTavern will listen on all network interfaces | boolean |
|
||||
@@ -366,7 +364,32 @@ Most often this is for people who want to use SillyTavern on their mobile phones
|
||||
|
||||
Read the detailed guide on how to set up remote connections in the [Docs](https://docs.sillytavern.app/usage/remoteconnections/).
|
||||
|
||||
You may also want to configure SillyTavern user profiles with (optional) password protection: [Users](https://docs.sillytavern.app/administration/multi-user/).
|
||||
You may also want to configure SillyTavern user profiles with (optional) password protection: [Users](https://docs.sillytavern.app/installation/st-1.12.0-migration-guide/#users).
|
||||
|
||||
## Performance issues?
|
||||
|
||||
### General tips
|
||||
|
||||
1. Disable the Blur Effect and enable Reduced Motion on the User Settings panel (UI Theme toggles category).
|
||||
2. If using response streaming, set the streaming FPS to a lower value (10-15 FPS is recommended).
|
||||
3. Make sure the browser is enabled to use GPU acceleration for rendering.
|
||||
|
||||
### Input lag
|
||||
|
||||
Performance degradation, particularly input lag, is most commonly attributed to browser extensions. Known problematic extensions include:
|
||||
|
||||
* iCloud Password Manager
|
||||
* DeepL Translation
|
||||
* AI-based grammar correction tools
|
||||
* Various ad-blocking extensions
|
||||
|
||||
If you experience performance issues and cannot identify the cause, or suspect an issue with SillyTavern itself, please:
|
||||
|
||||
1. [Record a performance profile](https://developer.chrome.com/docs/devtools/performance/reference)
|
||||
2. Export the profile as a JSON file
|
||||
3. Submit it to the development team for analysis
|
||||
|
||||
We recommend first testing with all browser extensions and third-party SillyTavern extensions disabled to isolate the source of the performance degradation.
|
||||
|
||||
## License and credits
|
||||
|
||||
|
14
.github/workflows/issues-auto-manager.yml
vendored
14
.github/workflows/issues-auto-manager.yml
vendored
@@ -32,7 +32,7 @@ jobs:
|
||||
with:
|
||||
configuration-path: .github/issues-auto-labels.yml
|
||||
enable-versioned-regex: 0
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
|
||||
label-on-labels:
|
||||
name: 🏷️ Label Issues by Labels
|
||||
@@ -46,7 +46,7 @@ jobs:
|
||||
uses: actions-cool/issues-helper@v3.6.0
|
||||
with:
|
||||
actions: 'add-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
labels: '👍 Approved'
|
||||
|
||||
- name: ❌ Remove progress labels when issue is marked done or stale
|
||||
@@ -56,7 +56,7 @@ jobs:
|
||||
uses: actions-cool/issues-helper@v3.6.0
|
||||
with:
|
||||
actions: 'remove-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
labels: '🧑💻 In Progress,🤔 Unsure,🤔 Under Consideration'
|
||||
|
||||
- name: ❌ Remove temporary labels when confirmed labels are added
|
||||
@@ -66,7 +66,7 @@ jobs:
|
||||
uses: actions-cool/issues-helper@v3.6.0
|
||||
with:
|
||||
actions: 'remove-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
labels: '🤔 Unsure,🤔 Under Consideration'
|
||||
|
||||
- name: ❌ Remove no bug labels when "🪲 Confirmed" is added
|
||||
@@ -76,7 +76,7 @@ jobs:
|
||||
uses: actions-cool/issues-helper@v3.6.0
|
||||
with:
|
||||
actions: 'remove-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
labels: '✖️ Not Reproducible,✖️ Not A Bug'
|
||||
|
||||
remove-stale-label:
|
||||
@@ -92,7 +92,7 @@ jobs:
|
||||
uses: actions-cool/issues-helper@v3.6.0
|
||||
with:
|
||||
actions: 'remove-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
issue-number: ${{ github.event.issue.number }}
|
||||
labels: '⚰️ Stale,🕸️ Inactive,🚏 Awaiting User Response,🛑 No Response'
|
||||
|
||||
@@ -113,4 +113,4 @@ jobs:
|
||||
uses: peaceiris/actions-label-commenter@v1.10.0
|
||||
with:
|
||||
config_file: .github/issues-auto-comments.yml
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
github_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
|
@@ -31,15 +31,15 @@ jobs:
|
||||
- name: Label Linked Issues
|
||||
id: label_linked_issues
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GH_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
for ISSUE in $(echo $issues | jq -r '.[]'); do
|
||||
if [ "${{ github.ref }}" == "refs/heads/staging" ]; then
|
||||
LABEL="✅ Done (staging)"
|
||||
gh issue edit $ISSUE -R ${{ github.repository }} --add-label "$LABEL" --remove-label "🧑💻 In Progress"
|
||||
gh issue edit $ISSUE -R ${{ github.repository }} --add-label "$LABEL"
|
||||
elif [ "${{ github.ref }}" == "refs/heads/release" ]; then
|
||||
LABEL="✅ Done"
|
||||
gh issue edit $ISSUE -R ${{ github.repository }} --add-label "$LABEL" --remove-label "🧑💻 In Progress"
|
||||
gh issue edit $ISSUE -R ${{ github.repository }} --add-label "$LABEL"
|
||||
fi
|
||||
echo "Added label '$LABEL' (and removed '🧑💻 In Progress' if present) in issue #$ISSUE"
|
||||
echo "Added label '$LABEL' to issue #$ISSUE"
|
||||
done
|
||||
|
6
.github/workflows/job-close-stale.yml
vendored
6
.github/workflows/job-close-stale.yml
vendored
@@ -22,7 +22,7 @@ jobs:
|
||||
# https://github.com/marketplace/actions/close-stale-issues
|
||||
uses: actions/stale@v9.1.0
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
days-before-stale: 183
|
||||
days-before-close: 7
|
||||
operations-per-run: 30
|
||||
@@ -56,7 +56,7 @@ jobs:
|
||||
# https://github.com/marketplace/actions/close-stale-issues
|
||||
uses: actions/stale@v9.1.0
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
days-before-stale: 7
|
||||
days-before-close: 7
|
||||
operations-per-run: 30
|
||||
@@ -83,7 +83,7 @@ jobs:
|
||||
# https://github.com/marketplace/actions/close-stale-issues
|
||||
uses: actions/stale@v9.1.0
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
days-before-stale: 7
|
||||
days-before-close: 7
|
||||
operations-per-run: 30
|
||||
|
2
.github/workflows/on-close-handler.yml
vendored
2
.github/workflows/on-close-handler.yml
vendored
@@ -23,6 +23,6 @@ jobs:
|
||||
uses: actions-cool/issues-helper@v3.6.0
|
||||
with:
|
||||
actions: remove-labels
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
issue-number: ${{ github.event.issue.number || github.event.pull_request.number }}
|
||||
labels: '🚏 Awaiting User Response,🧑💻 In Progress,📌 Keep Open,🚫 Merge Conflicts,🔬 Needs Testing,🔨 Needs Work,⚰️ Stale,⛔ Waiting For External/Upstream'
|
||||
|
2
.github/workflows/on-open-handler.yml
vendored
2
.github/workflows/on-open-handler.yml
vendored
@@ -24,6 +24,6 @@ jobs:
|
||||
uses: actions-cool/issues-helper@v3.6.0
|
||||
with:
|
||||
actions: 'add-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
issue-number: ${{ github.event.issue.number || github.event.pull_request.number }}
|
||||
labels: '👷 Maintainer'
|
||||
|
96
.github/workflows/pr-auto-manager.yml
vendored
96
.github/workflows/pr-auto-manager.yml
vendored
@@ -1,7 +1,6 @@
|
||||
name: 🔀 Pull Request Manager
|
||||
|
||||
on:
|
||||
workflow_dispatch: # Allow to manually call this workflow
|
||||
pull_request_target:
|
||||
types: [opened, synchronize, reopened, edited, labeled, unlabeled, closed]
|
||||
pull_request_review_comment:
|
||||
@@ -12,63 +11,9 @@ permissions:
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
run-eslint:
|
||||
name: ✅ Check ESLint on PR
|
||||
runs-on: ubuntu-latest
|
||||
# Only needs to run when code is changed
|
||||
if: github.event.action == 'opened' || github.event.action == 'synchronize'
|
||||
|
||||
# Override permissions, linter likely needs write access to issues
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
# Checkout
|
||||
# https://github.com/marketplace/actions/checkout
|
||||
uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||
|
||||
- name: Setup Node.js
|
||||
# Setup Node.js environment
|
||||
# https://github.com/marketplace/actions/setup-node-js-environment
|
||||
uses: actions/setup-node@v4.3.0
|
||||
with:
|
||||
node-version: 20
|
||||
|
||||
- name: Run npm install
|
||||
run: npm ci
|
||||
|
||||
- name: Run ESLint
|
||||
# Action ESLint
|
||||
# https://github.com/marketplace/actions/action-eslint
|
||||
uses: sibiraj-s/action-eslint@v3.0.1
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
eslint-args: '--ignore-path=.gitignore --quiet'
|
||||
extensions: 'js'
|
||||
annotations: true
|
||||
ignore-patterns: |
|
||||
dist/
|
||||
lib/
|
||||
|
||||
label-by-size:
|
||||
name: 🏷️ Label PR by Size
|
||||
# This job should run after all others, to prevent possible concurrency issues
|
||||
needs: [label-by-branches, label-by-files, remove-stale-label, check-merge-blocking-labels, write-auto-comments]
|
||||
runs-on: ubuntu-latest
|
||||
# Only needs to run when code is changed
|
||||
if: always() && (github.event.action == 'opened' || github.event.action == 'synchronize')
|
||||
|
||||
# Override permissions, the labeler needs issues write access
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Label PR Size
|
||||
@@ -76,7 +21,7 @@ jobs:
|
||||
# https://github.com/marketplace/actions/pull-request-size-labeler
|
||||
uses: codelytv/pr-size-labeler@v1.10.2
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
xs_label: '🟩 ⬤○○○○'
|
||||
xs_max_size: '20'
|
||||
s_label: '🟩 ⬤⬤○○○'
|
||||
@@ -87,6 +32,7 @@ jobs:
|
||||
l_max_size: '1000'
|
||||
xl_label: '🟥 ⬤⬤⬤⬤⬤'
|
||||
fail_if_xl: 'false'
|
||||
github_api_url: 'https://api.github.com'
|
||||
files_to_ignore: |
|
||||
"package-lock.json"
|
||||
"public/lib/*"
|
||||
@@ -94,8 +40,8 @@ jobs:
|
||||
label-by-branches:
|
||||
name: 🏷️ Label PR by Branches
|
||||
runs-on: ubuntu-latest
|
||||
# Only label once when PR is created or when base branch is changed, to allow manual label removal
|
||||
if: github.event.action == 'opened' || (github.event.action == 'synchronize' && github.event.changes.base)
|
||||
# Only label once when PR is created or branches are changed, to allow manual label removal
|
||||
if: github.event.action == 'opened' || (github.event.action == 'synchronize' && (github.event.changes.base || github.event.changes.head))
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
@@ -109,13 +55,11 @@ jobs:
|
||||
uses: actions/labeler@v5.0.0
|
||||
with:
|
||||
configuration-path: .github/pr-auto-labels-by-branch.yml
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
|
||||
label-by-files:
|
||||
name: 🏷️ Label PR by Files
|
||||
runs-on: ubuntu-latest
|
||||
# Only needs to run when code is changed
|
||||
if: github.event.action == 'opened' || github.event.action == 'synchronize'
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
@@ -129,20 +73,14 @@ jobs:
|
||||
uses: actions/labeler@v5.0.0
|
||||
with:
|
||||
configuration-path: .github/pr-auto-labels-by-files.yml
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
|
||||
remove-stale-label:
|
||||
name: 🗑️ Remove Stale Label on Comment
|
||||
runs-on: ubuntu-latest
|
||||
# Only runs on comments not done by the github actions bot
|
||||
# Only runs when this is not done by the github actions bot
|
||||
if: github.event_name == 'pull_request_review_comment' && github.actor != 'github-actions[bot]'
|
||||
|
||||
# Override permissions, issue labeler needs issues write access
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Remove Stale Label
|
||||
# 🤖 Issues Helper
|
||||
@@ -150,7 +88,7 @@ jobs:
|
||||
uses: actions-cool/issues-helper@v3.6.0
|
||||
with:
|
||||
actions: 'remove-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
issue-number: ${{ github.event.pull_request.number }}
|
||||
labels: '⚰️ Stale'
|
||||
|
||||
@@ -206,7 +144,7 @@ jobs:
|
||||
|
||||
write-auto-comments:
|
||||
name: 💬 Post PR Comments Based on Labels
|
||||
needs: [label-by-branches, label-by-files]
|
||||
needs: [label-by-size, label-by-branches, label-by-files]
|
||||
runs-on: ubuntu-latest
|
||||
# Run, even if the previous jobs were skipped/failed
|
||||
if: always()
|
||||
@@ -223,7 +161,7 @@ jobs:
|
||||
uses: peaceiris/actions-label-commenter@v1.10.0
|
||||
with:
|
||||
config_file: .github/pr-auto-comments.yml
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
github_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
|
||||
# This runs on merged PRs to staging, reading the PR body and directly linked issues. Check `issues-updates-on-merge.yml`:`update-linked-issues` for commit-based updates.
|
||||
update-linked-issues:
|
||||
@@ -231,12 +169,6 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'staging'
|
||||
|
||||
# Override permissions, We need to be able to write to issues
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Extract Linked Issues From PR Description
|
||||
id: extract_issues
|
||||
@@ -250,7 +182,7 @@ jobs:
|
||||
PR_NUMBER=${{ github.event.pull_request.number }}
|
||||
REPO=${{ github.repository }}
|
||||
API_URL="https://api.github.com/repos/$REPO/pulls/$PR_NUMBER/issues"
|
||||
ISSUES=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" "$API_URL" | jq -r '.[].number' | jq -R -s -c 'split("\n")[:-1]')
|
||||
ISSUES=$(curl -s -H "Authorization: token ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}" "$API_URL" | jq -r '.[].number' | jq -R -s -c 'split("\n")[:-1]')
|
||||
echo "linked_issues=$ISSUES" >> $GITHUB_ENV
|
||||
|
||||
- name: Merge Issue Lists
|
||||
@@ -262,9 +194,9 @@ jobs:
|
||||
- name: Label Linked Issues
|
||||
id: label_linked_issues
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GH_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
for ISSUE in $(echo $final_issues | jq -r '.[]'); do
|
||||
gh issue edit $ISSUE -R ${{ github.repository }} --add-label "✅ Done (staging)" --remove-label "🧑💻 In Progress"
|
||||
echo "Added label '✅ Done (staging)' (and removed '🧑💻 In Progress' if present) in issue #$ISSUE"
|
||||
gh issue edit $ISSUE -R ${{ github.repository }} --add-label "✅ Done (staging)"
|
||||
echo "Added label '✅ Done (staging)' to issue #$ISSUE"
|
||||
done
|
||||
|
@@ -23,6 +23,6 @@ jobs:
|
||||
uses: eps1lon/actions-label-merge-conflict@v3.0.3
|
||||
with:
|
||||
dirtyLabel: '🚫 Merge Conflicts'
|
||||
repoToken: ${{ secrets.GITHUB_TOKEN }}
|
||||
repoToken: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
commentOnDirty: >
|
||||
⚠️ This PR has conflicts that need to be resolved before it can be merged.
|
||||
|
@@ -12,4 +12,3 @@ access.log
|
||||
.vscode
|
||||
.git
|
||||
/public/scripts/extensions/third-party
|
||||
/colab
|
||||
|
10
Dockerfile
10
Dockerfile
@@ -4,7 +4,7 @@ FROM node:lts-alpine3.19
|
||||
ARG APP_HOME=/home/node/app
|
||||
|
||||
# Install system dependencies
|
||||
RUN apk add --no-cache gcompat tini git git-lfs
|
||||
RUN apk add --no-cache gcompat tini git
|
||||
|
||||
# Create app directory
|
||||
WORKDIR ${APP_HOME}
|
||||
@@ -12,13 +12,15 @@ WORKDIR ${APP_HOME}
|
||||
# Set NODE_ENV to production
|
||||
ENV NODE_ENV=production
|
||||
|
||||
# Bundle app source
|
||||
COPY . ./
|
||||
|
||||
# Install app dependencies
|
||||
COPY package*.json post-install.js ./
|
||||
RUN \
|
||||
echo "*** Install npm packages ***" && \
|
||||
npm i --no-audit --no-fund --loglevel=error --no-progress --omit=dev && npm cache clean --force
|
||||
|
||||
# Bundle app source
|
||||
COPY . ./
|
||||
|
||||
# Copy default chats, characters and user avatars to <folder>.default folder
|
||||
RUN \
|
||||
rm -f "config.yaml" || true && \
|
||||
|
@@ -70,7 +70,7 @@ enableDiscreetLogin: false
|
||||
# https://www.authelia.com/
|
||||
# This will use auto login to an account with the same username
|
||||
# as that used for authlia. (Ensure the username in authlia
|
||||
# is an exact match in lowercase with that in sillytavern)
|
||||
# is an exact match with that in sillytavern)
|
||||
autheliaAuth: false
|
||||
# If `basicAuthMode` and this are enabled then
|
||||
# the username and passwords for basic auth are the same as those
|
||||
@@ -114,8 +114,6 @@ backups:
|
||||
chat:
|
||||
# Enable automatic chat backups
|
||||
enabled: true
|
||||
# Verify integrity of chat files before saving
|
||||
checkIntegrity: true
|
||||
# Maximum number of chat backups to keep per user (starting from the most recent). Set to -1 to keep all backups.
|
||||
maxTotalBackups: -1
|
||||
# Interval in milliseconds to throttle chat backups per user
|
||||
@@ -142,8 +140,6 @@ performance:
|
||||
lazyLoadCharacters: false
|
||||
# The maximum amount of memory that parsed character cards can use. Set to 0 to disable memory caching.
|
||||
memoryCacheCapacity: '100mb'
|
||||
# Enables disk caching for character cards. Improves performances with large card libraries.
|
||||
useDiskCache: true
|
||||
|
||||
# Allow secret keys exposure via API
|
||||
allowKeysExposure: false
|
||||
@@ -155,7 +151,6 @@ whitelistImportDomains:
|
||||
- cdn.discordapp.com
|
||||
- files.catbox.moe
|
||||
- raw.githubusercontent.com
|
||||
- char-archive.evulid.cc
|
||||
# API request overrides (for KoboldAI and Text Completion APIs)
|
||||
## Note: host includes the port number if it's not the default (80 or 443)
|
||||
## Format is an array of objects:
|
||||
@@ -234,14 +229,6 @@ claude:
|
||||
# should be ideal for most use cases.
|
||||
# Any value other than a non-negative integer will be ignored and caching at depth will not be enabled.
|
||||
cachingAtDepth: -1
|
||||
# Use 1h TTL instead of the default 5m.
|
||||
## 5m: base price x 1.25
|
||||
## 1h: base price x 2
|
||||
extendedTTL: false
|
||||
# -- GOOGLE GEMINI API CONFIGURATION --
|
||||
gemini:
|
||||
# API endpoint version ("v1beta" or "v1alpha")
|
||||
apiVersion: 'v1beta'
|
||||
# -- SERVER PLUGIN CONFIGURATION --
|
||||
enableServerPlugins: false
|
||||
# Attempt to automatically update server plugins on startup
|
||||
|
@@ -540,7 +540,7 @@
|
||||
"type": "context"
|
||||
},
|
||||
{
|
||||
"filename": "presets/context/Metharme.json",
|
||||
"filename": "presets/context/Pygmalion.json",
|
||||
"type": "context"
|
||||
},
|
||||
{
|
||||
@@ -563,10 +563,6 @@
|
||||
"filename": "presets/context/Llama 3 Instruct.json",
|
||||
"type": "context"
|
||||
},
|
||||
{
|
||||
"filename": "presets/context/Llama 4 Instruct.json",
|
||||
"type": "context"
|
||||
},
|
||||
{
|
||||
"filename": "presets/context/Phi.json",
|
||||
"type": "context"
|
||||
@@ -619,6 +615,10 @@
|
||||
"filename": "presets/instruct/OpenOrca-OpenChat.json",
|
||||
"type": "instruct"
|
||||
},
|
||||
{
|
||||
"filename": "presets/instruct/Pygmalion.json",
|
||||
"type": "instruct"
|
||||
},
|
||||
{
|
||||
"filename": "presets/instruct/Story.json",
|
||||
"type": "instruct"
|
||||
@@ -663,10 +663,6 @@
|
||||
"filename": "presets/instruct/Llama 3 Instruct.json",
|
||||
"type": "instruct"
|
||||
},
|
||||
{
|
||||
"filename": "presets/instruct/Llama 4 Instruct.json",
|
||||
"type": "instruct"
|
||||
},
|
||||
{
|
||||
"filename": "presets/instruct/Phi.json",
|
||||
"type": "instruct"
|
||||
@@ -751,10 +747,6 @@
|
||||
"filename": "presets/sysprompt/Neutral - Chat.json",
|
||||
"type": "sysprompt"
|
||||
},
|
||||
{
|
||||
"filename": "presets/sysprompt/Lightning 1.1.json",
|
||||
"type": "sysprompt"
|
||||
},
|
||||
{
|
||||
"filename": "presets/instruct/Mistral V1.json",
|
||||
"type": "instruct"
|
||||
@@ -794,21 +786,5 @@
|
||||
{
|
||||
"filename": "presets/context/DeepSeek-V2.5.json",
|
||||
"type": "context"
|
||||
},
|
||||
{
|
||||
"filename": "presets/instruct/GLM-4.json",
|
||||
"type": "instruct"
|
||||
},
|
||||
{
|
||||
"filename": "presets/context/GLM-4.json",
|
||||
"type": "context"
|
||||
},
|
||||
{
|
||||
"filename": "presets/reasoning/DeepSeek.json",
|
||||
"type": "reasoning"
|
||||
},
|
||||
{
|
||||
"filename": "presets/reasoning/Blank.json",
|
||||
"type": "reasoning"
|
||||
}
|
||||
]
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": false,
|
||||
"trim_sentences": false,
|
||||
"single_line": true,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": false,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>New Roleplay:<|END_OF_TURN_TOKEN|>",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "***",
|
||||
"chat_start": "***",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": false,
|
||||
"trim_sentences": true,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "<|eot_id|>\n<|start_header_id|>user<|end_header_id|>\n\nWrite an example narrative / conversation that is not part of the main story.",
|
||||
"chat_start": "<|eot_id|>\n<|start_header_id|>user<|end_header_id|>\n\nStart the role-play between {{char}} and {{user}}.",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": false,
|
||||
"trim_sentences": true,
|
||||
"single_line": false,
|
||||
|
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"story_string": "[gMASK]<sop>{{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality: {{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}{{trim}}\n",
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
"name": "GLM-4"
|
||||
}
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "### Example:",
|
||||
"chat_start": "### START ROLEPLAY:",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -1,8 +1,9 @@
|
||||
{
|
||||
"story_string": "Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instruction:\n{{system}}\n{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{char}}'s description:{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality:{{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{user}}'s persona: {{persona}}\n{{/if}}\n\n",
|
||||
"example_separator": "Example of an interaction:\n",
|
||||
"chat_start": "This is the history of the roleplay:\n",
|
||||
"story_string": "{{system}}\n{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{char}}'s description:{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality:{{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{user}}'s persona: {{persona}}\n{{/if}}",
|
||||
"example_separator": "Example of an interaction:",
|
||||
"chat_start": "This is the history of the roleplay:",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"story_string": "<|begin_of_text|><|header_start|>system<|header_end|>\n\n{{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality: {{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}{{trim}}<|eot|>",
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
"name": "Llama 4 Instruct"
|
||||
}
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "***",
|
||||
"chat_start": "***",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "This is how {{char}} should talk",
|
||||
"chat_start": "\nThen the roleplay chat between {{user}} and {{char}} begins.\n",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,8 +3,9 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
"name": "Metharme"
|
||||
"name": "Pygmalion"
|
||||
}
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -3,6 +3,7 @@
|
||||
"example_separator": "### New Roleplay:",
|
||||
"chat_start": "### New Roleplay:",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"single_line": false,
|
||||
|
@@ -6,7 +6,7 @@
|
||||
"stop_sequence": "<|im_end|>",
|
||||
"wrap": true,
|
||||
"macro": true,
|
||||
"names_behavior": "force",
|
||||
"names_behavior": "always",
|
||||
"activation_regex": "",
|
||||
"system_sequence_prefix": "",
|
||||
"system_sequence_suffix": "",
|
||||
|
@@ -8,7 +8,7 @@
|
||||
"stop_sequence": "<|END_OF_TURN_TOKEN|>",
|
||||
"wrap": false,
|
||||
"macro": true,
|
||||
"names_behavior": "force",
|
||||
"names_behavior": "always",
|
||||
"activation_regex": "",
|
||||
"skip_examples": false,
|
||||
"output_suffix": "<|END_OF_TURN_TOKEN|>",
|
||||
|
@@ -6,7 +6,7 @@
|
||||
"stop_sequence": "<end_of_turn>",
|
||||
"wrap": true,
|
||||
"macro": true,
|
||||
"names_behavior": "force",
|
||||
"names_behavior": "none",
|
||||
"activation_regex": "",
|
||||
"system_sequence_prefix": "",
|
||||
"system_sequence_suffix": "",
|
||||
|
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"input_sequence": "### Instruction:",
|
||||
"output_sequence": "### Response:",
|
||||
"last_output_sequence": "### Response: (length = unlimited)",
|
||||
"output_sequence": "### Response: (length = unlimited)",
|
||||
"last_output_sequence": "",
|
||||
"system_sequence": "",
|
||||
"stop_sequence": "",
|
||||
"wrap": true,
|
||||
@@ -12,8 +12,8 @@
|
||||
"system_sequence_suffix": "",
|
||||
"first_output_sequence": "",
|
||||
"skip_examples": false,
|
||||
"output_suffix": "\n\n",
|
||||
"input_suffix": "\n\n",
|
||||
"output_suffix": "",
|
||||
"input_suffix": "",
|
||||
"system_suffix": "",
|
||||
"user_alignment_message": "",
|
||||
"system_same_as_user": true,
|
||||
|
@@ -6,7 +6,7 @@
|
||||
"stop_sequence": "<|eot_id|>",
|
||||
"wrap": false,
|
||||
"macro": true,
|
||||
"names_behavior": "force",
|
||||
"names_behavior": "always",
|
||||
"activation_regex": "",
|
||||
"system_sequence_prefix": "",
|
||||
"system_sequence_suffix": "",
|
||||
@@ -16,7 +16,7 @@
|
||||
"input_suffix": "<|eot_id|>",
|
||||
"system_suffix": "<|eot_id|>",
|
||||
"user_alignment_message": "",
|
||||
"system_same_as_user": false,
|
||||
"system_same_as_user": true,
|
||||
"last_system_sequence": "",
|
||||
"name": "Llama 3 Instruct"
|
||||
}
|
||||
|
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"input_sequence": "<|header_start|>user<|header_end|>\n\n",
|
||||
"output_sequence": "<|header_start|>assistant<|header_end|>\n\n",
|
||||
"last_output_sequence": "",
|
||||
"system_sequence": "<|header_start|>system<|header_end|>\n\n",
|
||||
"stop_sequence": "<|eot|>",
|
||||
"wrap": false,
|
||||
"macro": true,
|
||||
"names_behavior": "force",
|
||||
"activation_regex": "",
|
||||
"system_sequence_prefix": "",
|
||||
"system_sequence_suffix": "",
|
||||
"first_output_sequence": "",
|
||||
"skip_examples": false,
|
||||
"output_suffix": "<|eot|>",
|
||||
"input_suffix": "<|eot|>",
|
||||
"system_suffix": "<|eot|>",
|
||||
"user_alignment_message": "",
|
||||
"system_same_as_user": false,
|
||||
"last_system_sequence": "",
|
||||
"name": "Llama 4 Instruct"
|
||||
}
|
@@ -6,7 +6,7 @@
|
||||
"stop_sequence": "",
|
||||
"wrap": false,
|
||||
"macro": true,
|
||||
"names_behavior": "force",
|
||||
"names_behavior": "always",
|
||||
"activation_regex": "",
|
||||
"system_sequence_prefix": "",
|
||||
"system_sequence_suffix": "",
|
||||
|
@@ -6,7 +6,7 @@
|
||||
"stop_sequence": "",
|
||||
"wrap": false,
|
||||
"macro": true,
|
||||
"names_behavior": "force",
|
||||
"names_behavior": "always",
|
||||
"activation_regex": "",
|
||||
"system_sequence_prefix": "",
|
||||
"system_sequence_suffix": "",
|
||||
|
@@ -6,7 +6,7 @@
|
||||
"stop_sequence": "",
|
||||
"wrap": false,
|
||||
"macro": true,
|
||||
"names_behavior": "force",
|
||||
"names_behavior": "always",
|
||||
"activation_regex": "",
|
||||
"system_sequence_prefix": "",
|
||||
"system_sequence_suffix": "",
|
||||
|
@@ -6,7 +6,7 @@
|
||||
"stop_sequence": "</s>",
|
||||
"wrap": false,
|
||||
"macro": true,
|
||||
"names_behavior": "force",
|
||||
"names_behavior": "always",
|
||||
"activation_regex": "",
|
||||
"system_sequence_prefix": "",
|
||||
"system_sequence_suffix": "",
|
||||
|
@@ -8,7 +8,7 @@
|
||||
"stop_sequence": "<|end|>",
|
||||
"wrap": false,
|
||||
"macro": true,
|
||||
"names_behavior": "force",
|
||||
"names_behavior": "always",
|
||||
"activation_regex": "",
|
||||
"skip_examples": false,
|
||||
"output_suffix": "<|end|>\n",
|
||||
|
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"input_sequence": "<|user|>\n",
|
||||
"output_sequence": "<|assistant|>\n",
|
||||
"first_output_sequence": "",
|
||||
"input_sequence": "<|user|>",
|
||||
"output_sequence": "<|model|>",
|
||||
"last_output_sequence": "",
|
||||
"system_sequence_prefix": "<|system|>\n",
|
||||
"system_sequence_suffix": "",
|
||||
"stop_sequence": "",
|
||||
"system_sequence": "",
|
||||
"stop_sequence": "<|user|>",
|
||||
"wrap": false,
|
||||
"macro": true,
|
||||
"names_behavior": "force",
|
||||
"names_behavior": "always",
|
||||
"activation_regex": "",
|
||||
"system_sequence_prefix": "<|system|>",
|
||||
"system_sequence_suffix": "",
|
||||
"first_output_sequence": "",
|
||||
"skip_examples": false,
|
||||
"output_suffix": "",
|
||||
"input_suffix": "",
|
||||
"system_sequence": "",
|
||||
"system_suffix": "",
|
||||
"user_alignment_message": "",
|
||||
"last_system_sequence": "",
|
||||
"system_same_as_user": true,
|
||||
"name": "GLM-4"
|
||||
"last_system_sequence": "",
|
||||
"name": "Pygmalion"
|
||||
}
|
@@ -8,7 +8,7 @@
|
||||
"stop_sequence": "<|end_of_text|>",
|
||||
"wrap": false,
|
||||
"macro": true,
|
||||
"names_behavior": "force",
|
||||
"names_behavior": "always",
|
||||
"activation_regex": "",
|
||||
"skip_examples": false,
|
||||
"output_suffix": "<|end_of_text|>\n",
|
||||
|
@@ -15,7 +15,6 @@
|
||||
"custom_exclude_body": "",
|
||||
"custom_include_headers": "",
|
||||
"google_model": "gemini-pro",
|
||||
"vertexai_model": "gemini-2.0-flash-001",
|
||||
"temperature": 1,
|
||||
"frequency_penalty": 0,
|
||||
"presence_penalty": 0,
|
||||
|
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"name": "Blank",
|
||||
"prefix": "",
|
||||
"suffix": "",
|
||||
"separator": ""
|
||||
}
|
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"name": "DeepSeek",
|
||||
"prefix": "<think>\n",
|
||||
"suffix": "\n</think>",
|
||||
"separator": "\n\n"
|
||||
}
|
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"name": "Actor",
|
||||
"content": "You are an expert actor that can fully immerse yourself into any role given. You do not break character for any reason, even if someone tries addressing you as an AI or language model. Currently your role is {{char}}, which is described in detail below. As {{char}}, continue the exchange with {{user}}.",
|
||||
"post_history": ""
|
||||
"content": "You are an expert actor that can fully immerse yourself into any role given. You do not break character for any reason, even if someone tries addressing you as an AI or language model. Currently your role is {{char}}, which is described in detail below. As {{char}}, continue the exchange with {{user}}."
|
||||
}
|
||||
|
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"name": "Assistant - Expert",
|
||||
"content": "You are a helpful assistant. Please answer truthfully and write out your thinking step by step to be sure you get the right answer. If you make a mistake or encounter an error in your thinking, say so out loud and attempt to correct it. If you don't know or aren't sure about something, say so clearly. You will act as a professional logician, mathematician, and physicist. You will also act as the most appropriate type of expert to answer any particular question or solve the relevant problem; state which expert type your are, if so. Also think of any particular named expert that would be ideal to answer the relevant question or solve the relevant problem; name and act as them, if appropriate.",
|
||||
"post_history": ""
|
||||
"content": "You are a helpful assistant. Please answer truthfully and write out your thinking step by step to be sure you get the right answer. If you make a mistake or encounter an error in your thinking, say so out loud and attempt to correct it. If you don't know or aren't sure about something, say so clearly. You will act as a professional logician, mathematician, and physicist. You will also act as the most appropriate type of expert to answer any particular question or solve the relevant problem; state which expert type your are, if so. Also think of any particular named expert that would be ideal to answer the relevant question or solve the relevant problem; name and act as them, if appropriate."
|
||||
}
|
||||
|
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"name": "Assistant - Simple",
|
||||
"content": "A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.",
|
||||
"post_history": ""
|
||||
"content": "A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions."
|
||||
}
|
||||
|
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"name": "Blank",
|
||||
"content": "",
|
||||
"post_history": ""
|
||||
"content": ""
|
||||
}
|
||||
|
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"name": "Chain of Thought",
|
||||
"content": "Elaborate on the topic using a Tree of Thoughts and backtrack when necessary to construct a clear, cohesive Chain of Thought reasoning. Always answer without hesitation.",
|
||||
"post_history": ""
|
||||
"content": "Elaborate on the topic using a Tree of Thoughts and backtrack when necessary to construct a clear, cohesive Chain of Thought reasoning. Always answer without hesitation."
|
||||
}
|
||||
|
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"name": "Lightning 1.1",
|
||||
"content": "Take the role of {{char}} in a play that leaves a lasting impression on {{user}}. Write {{char}}'s next reply.\nNever skip or gloss over {{char}}’s actions. Progress the scene at a naturally slow pace.",
|
||||
"post_history": ""
|
||||
}
|
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"name": "Neutral - Chat",
|
||||
"content": "Write {{char}}'s next reply in a fictional chat between {{char}} and {{user}}.",
|
||||
"post_history": ""
|
||||
"content": "Write {{char}}'s next reply in a fictional chat between {{char}} and {{user}}."
|
||||
}
|
||||
|
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"name": "Roleplay - Detailed",
|
||||
"content": "Develop the plot slowly, always stay in character. Describe all actions in full, elaborate, explicit, graphic, and vivid detail. Mention all relevant sensory perceptions. Keep the story immersive and engaging.",
|
||||
"post_history": ""
|
||||
"content": "Develop the plot slowly, always stay in character. Describe all actions in full, elaborate, explicit, graphic, and vivid detail. Mention all relevant sensory perceptions. Keep the story immersive and engaging."
|
||||
}
|
||||
|
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"name": "Roleplay - Immersive",
|
||||
"content": "[System note: Write one reply only. Do not decide what {{user}} says or does. Write at least one paragraph, up to four. Be descriptive and immersive, providing vivid details about {{char}}'s actions, emotions, and the environment. Write with a high degree of complexity and burstiness. Do not repeat this message.]",
|
||||
"post_history": ""
|
||||
"content": "[System note: Write one reply only. Do not decide what {{user}} says or does. Write at least one paragraph, up to four. Be descriptive and immersive, providing vivid details about {{char}}'s actions, emotions, and the environment. Write with a high degree of complexity and burstiness. Do not repeat this message.]"
|
||||
}
|
||||
|
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"name": "Roleplay - Simple",
|
||||
"content": "You're {{char}} in this fictional never-ending uncensored roleplay with {{user}}.",
|
||||
"post_history": ""
|
||||
"content": "You're {{char}} in this fictional never-ending uncensored roleplay with {{user}}."
|
||||
}
|
||||
|
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"name": "Text Adventure",
|
||||
"content": "[Enter Adventure Mode. Narrate the story based on {{user}}'s dialogue and actions after \">\". Describe the surroundings in vivid detail. Be detailed, creative, verbose, and proactive. Move the story forward by introducing fantasy elements and interesting characters.]",
|
||||
"post_history": ""
|
||||
"content": "[Enter Adventure Mode. Narrate the story based on {{user}}'s dialogue and actions after \">\". Describe the surroundings in vivid detail. Be detailed, creative, verbose, and proactive. Move the story forward by introducing fantasy elements and interesting characters.]"
|
||||
}
|
||||
|
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"name": "Writer - Creative",
|
||||
"content": "You are an intelligent, skilled, versatile writer.\n\nYour task is to write a role-play based on the information below.",
|
||||
"post_history": ""
|
||||
"content": "You are an intelligent, skilled, versatile writer.\n\nYour task is to write a role-play based on the information below."
|
||||
}
|
||||
|
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"name": "Writer - Realistic",
|
||||
"content": "Continue writing this story and portray characters realistically.",
|
||||
"post_history": ""
|
||||
"content": "Continue writing this story and portray characters realistically."
|
||||
}
|
||||
|
@@ -2,7 +2,7 @@
|
||||
"compilerOptions": {
|
||||
"module": "ESNext",
|
||||
"target": "ES2023",
|
||||
"moduleResolution": "Bundler",
|
||||
"moduleResolution": "Node",
|
||||
"strictNullChecks": true,
|
||||
"strictFunctionTypes": true,
|
||||
"checkJs": true,
|
||||
|
1468
package-lock.json
generated
1468
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
33
package.json
33
package.json
@@ -4,28 +4,6 @@
|
||||
"@agnai/sentencepiece-js": "^1.1.1",
|
||||
"@agnai/web-tokenizers": "^0.1.3",
|
||||
"@iconfu/svg-inject": "^1.2.3",
|
||||
"@jimp/core": "^1.6.0",
|
||||
"@jimp/js-bmp": "^1.6.0",
|
||||
"@jimp/js-gif": "^1.6.0",
|
||||
"@jimp/js-tiff": "^1.6.0",
|
||||
"@jimp/plugin-blit": "^1.6.0",
|
||||
"@jimp/plugin-circle": "^1.6.0",
|
||||
"@jimp/plugin-color": "^1.6.0",
|
||||
"@jimp/plugin-contain": "^1.6.0",
|
||||
"@jimp/plugin-cover": "^1.6.0",
|
||||
"@jimp/plugin-crop": "^1.6.0",
|
||||
"@jimp/plugin-displace": "^1.6.0",
|
||||
"@jimp/plugin-fisheye": "^1.6.0",
|
||||
"@jimp/plugin-flip": "^1.6.0",
|
||||
"@jimp/plugin-mask": "^1.6.0",
|
||||
"@jimp/plugin-quantize": "^1.6.0",
|
||||
"@jimp/plugin-resize": "^1.6.0",
|
||||
"@jimp/plugin-rotate": "^1.6.0",
|
||||
"@jimp/plugin-threshold": "^1.6.0",
|
||||
"@jimp/wasm-avif": "^1.6.0",
|
||||
"@jimp/wasm-jpeg": "^1.6.0",
|
||||
"@jimp/wasm-png": "^1.6.0",
|
||||
"@jimp/wasm-webp": "^1.6.0",
|
||||
"@mozilla/readability": "^0.6.0",
|
||||
"@popperjs/core": "^2.11.8",
|
||||
"@zeldafan0225/ai_horde": "^5.2.0",
|
||||
@@ -40,7 +18,6 @@
|
||||
"cookie-parser": "^1.4.6",
|
||||
"cookie-session": "^2.1.0",
|
||||
"cors": "^2.8.5",
|
||||
"crc": "^4.3.2",
|
||||
"csrf-sync": "^4.0.3",
|
||||
"diff-match-patch": "^1.0.5",
|
||||
"dompurify": "^3.2.4",
|
||||
@@ -59,16 +36,18 @@
|
||||
"ip-regex": "^5.0.0",
|
||||
"ipaddr.js": "^2.2.0",
|
||||
"is-docker": "^3.0.0",
|
||||
"jimp": "^0.22.10",
|
||||
"localforage": "^1.10.0",
|
||||
"lodash": "^4.17.21",
|
||||
"mime-types": "^2.1.35",
|
||||
"moment": "^2.30.1",
|
||||
"morphdom": "^2.7.4",
|
||||
"multer": "^2.0.1",
|
||||
"multer": "^1.4.5-lts.1",
|
||||
"node-fetch": "^3.3.2",
|
||||
"node-persist": "^4.0.4",
|
||||
"open": "^8.4.2",
|
||||
"png-chunk-text": "^1.0.0",
|
||||
"png-chunks-encode": "^1.0.0",
|
||||
"png-chunks-extract": "^1.0.0",
|
||||
"proxy-agent": "^6.5.0",
|
||||
"rate-limiter-flexible": "^5.0.5",
|
||||
@@ -111,7 +90,7 @@
|
||||
"type": "git",
|
||||
"url": "https://github.com/SillyTavern/SillyTavern.git"
|
||||
},
|
||||
"version": "1.13.0",
|
||||
"version": "1.12.13",
|
||||
"scripts": {
|
||||
"start": "node server.js",
|
||||
"debug": "node --inspect server.js",
|
||||
@@ -153,6 +132,7 @@
|
||||
"@types/node": "^18.19.80",
|
||||
"@types/node-persist": "^3.1.8",
|
||||
"@types/png-chunk-text": "^1.0.3",
|
||||
"@types/png-chunks-encode": "^1.0.2",
|
||||
"@types/png-chunks-extract": "^1.0.2",
|
||||
"@types/response-time": "^2.3.8",
|
||||
"@types/select2": "^4.0.63",
|
||||
@@ -160,7 +140,6 @@
|
||||
"@types/write-file-atomic": "^4.0.3",
|
||||
"@types/yargs": "^17.0.33",
|
||||
"@types/yauzl": "^2.10.3",
|
||||
"eslint": "^8.57.1",
|
||||
"eslint-plugin-jsdoc": "^48.10.0"
|
||||
"eslint": "^8.57.1"
|
||||
}
|
||||
}
|
||||
|
232
post-install.js
232
post-install.js
@@ -3,17 +3,133 @@
|
||||
*/
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import crypto from 'node:crypto';
|
||||
import process from 'node:process';
|
||||
import yaml from 'yaml';
|
||||
import _ from 'lodash';
|
||||
import chalk from 'chalk';
|
||||
import { createRequire } from 'node:module';
|
||||
import { addMissingConfigValues } from './src/config-init.js';
|
||||
|
||||
/**
|
||||
* Colorizes console output.
|
||||
*/
|
||||
const color = chalk;
|
||||
|
||||
const keyMigrationMap = [
|
||||
{
|
||||
oldKey: 'disableThumbnails',
|
||||
newKey: 'thumbnails.enabled',
|
||||
migrate: (value) => !value,
|
||||
},
|
||||
{
|
||||
oldKey: 'thumbnailsQuality',
|
||||
newKey: 'thumbnails.quality',
|
||||
migrate: (value) => value,
|
||||
},
|
||||
{
|
||||
oldKey: 'avatarThumbnailsPng',
|
||||
newKey: 'thumbnails.format',
|
||||
migrate: (value) => (value ? 'png' : 'jpg'),
|
||||
},
|
||||
{
|
||||
oldKey: 'disableChatBackup',
|
||||
newKey: 'backups.chat.enabled',
|
||||
migrate: (value) => !value,
|
||||
},
|
||||
{
|
||||
oldKey: 'numberOfBackups',
|
||||
newKey: 'backups.common.numberOfBackups',
|
||||
migrate: (value) => value,
|
||||
},
|
||||
{
|
||||
oldKey: 'maxTotalChatBackups',
|
||||
newKey: 'backups.chat.maxTotalBackups',
|
||||
migrate: (value) => value,
|
||||
},
|
||||
{
|
||||
oldKey: 'chatBackupThrottleInterval',
|
||||
newKey: 'backups.chat.throttleInterval',
|
||||
migrate: (value) => value,
|
||||
},
|
||||
{
|
||||
oldKey: 'enableExtensions',
|
||||
newKey: 'extensions.enabled',
|
||||
migrate: (value) => value,
|
||||
},
|
||||
{
|
||||
oldKey: 'enableExtensionsAutoUpdate',
|
||||
newKey: 'extensions.autoUpdate',
|
||||
migrate: (value) => value,
|
||||
},
|
||||
{
|
||||
oldKey: 'extras.disableAutoDownload',
|
||||
newKey: 'extensions.models.autoDownload',
|
||||
migrate: (value) => !value,
|
||||
},
|
||||
{
|
||||
oldKey: 'extras.classificationModel',
|
||||
newKey: 'extensions.models.classification',
|
||||
migrate: (value) => value,
|
||||
},
|
||||
{
|
||||
oldKey: 'extras.captioningModel',
|
||||
newKey: 'extensions.models.captioning',
|
||||
migrate: (value) => value,
|
||||
},
|
||||
{
|
||||
oldKey: 'extras.embeddingModel',
|
||||
newKey: 'extensions.models.embedding',
|
||||
migrate: (value) => value,
|
||||
},
|
||||
{
|
||||
oldKey: 'extras.speechToTextModel',
|
||||
newKey: 'extensions.models.speechToText',
|
||||
migrate: (value) => value,
|
||||
},
|
||||
{
|
||||
oldKey: 'extras.textToSpeechModel',
|
||||
newKey: 'extensions.models.textToSpeech',
|
||||
migrate: (value) => value,
|
||||
},
|
||||
{
|
||||
oldKey: 'minLogLevel',
|
||||
newKey: 'logging.minLogLevel',
|
||||
migrate: (value) => value,
|
||||
},
|
||||
{
|
||||
oldKey: 'cardsCacheCapacity',
|
||||
newKey: 'performance.memoryCacheCapacity',
|
||||
migrate: (value) => `${value}mb`,
|
||||
},
|
||||
{
|
||||
oldKey: 'cookieSecret',
|
||||
newKey: 'cookieSecret',
|
||||
migrate: () => void 0,
|
||||
remove: true,
|
||||
},
|
||||
];
|
||||
|
||||
/**
|
||||
* Gets all keys from an object recursively.
|
||||
* @param {object} obj Object to get all keys from
|
||||
* @param {string} prefix Prefix to prepend to all keys
|
||||
* @returns {string[]} Array of all keys in the object
|
||||
*/
|
||||
function getAllKeys(obj, prefix = '') {
|
||||
if (typeof obj !== 'object' || Array.isArray(obj) || obj === null) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return _.flatMap(Object.keys(obj), key => {
|
||||
const newPrefix = prefix ? `${prefix}.${key}` : key;
|
||||
if (typeof obj[key] === 'object' && !Array.isArray(obj[key])) {
|
||||
return getAllKeys(obj[key], newPrefix);
|
||||
} else {
|
||||
return [newPrefix];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts the old config.conf file to the new config.yaml format.
|
||||
*/
|
||||
@@ -40,6 +156,71 @@ function convertConfig() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares the current config.yaml with the default config.yaml and adds any missing values.
|
||||
*/
|
||||
function addMissingConfigValues() {
|
||||
try {
|
||||
const defaultConfig = yaml.parse(fs.readFileSync(path.join(process.cwd(), './default/config.yaml'), 'utf8'));
|
||||
let config = yaml.parse(fs.readFileSync(path.join(process.cwd(), './config.yaml'), 'utf8'));
|
||||
|
||||
// Migrate old keys to new keys
|
||||
const migratedKeys = [];
|
||||
for (const { oldKey, newKey, migrate, remove } of keyMigrationMap) {
|
||||
if (_.has(config, oldKey)) {
|
||||
if (remove) {
|
||||
_.unset(config, oldKey);
|
||||
migratedKeys.push({
|
||||
oldKey,
|
||||
newValue: void 0,
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
const oldValue = _.get(config, oldKey);
|
||||
const newValue = migrate(oldValue);
|
||||
_.set(config, newKey, newValue);
|
||||
_.unset(config, oldKey);
|
||||
|
||||
migratedKeys.push({
|
||||
oldKey,
|
||||
newKey,
|
||||
oldValue,
|
||||
newValue,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Get all keys from the original config
|
||||
const originalKeys = getAllKeys(config);
|
||||
|
||||
// Use lodash's defaultsDeep function to recursively apply default properties
|
||||
config = _.defaultsDeep(config, defaultConfig);
|
||||
|
||||
// Get all keys from the updated config
|
||||
const updatedKeys = getAllKeys(config);
|
||||
|
||||
// Find the keys that were added
|
||||
const addedKeys = _.difference(updatedKeys, originalKeys);
|
||||
|
||||
if (addedKeys.length === 0 && migratedKeys.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (addedKeys.length > 0) {
|
||||
console.log('Adding missing config values to config.yaml:', addedKeys);
|
||||
}
|
||||
|
||||
if (migratedKeys.length > 0) {
|
||||
console.log('Migrating config values in config.yaml:', migratedKeys);
|
||||
}
|
||||
|
||||
fs.writeFileSync('./config.yaml', yaml.stringify(config));
|
||||
} catch (error) {
|
||||
console.error(color.red('FATAL: Could not add missing config values to config.yaml'), error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the default config files if they don't exist yet.
|
||||
*/
|
||||
@@ -102,13 +283,58 @@ function createDefaultFiles() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the MD5 hash of the given data.
|
||||
* @param {Buffer} data Input data
|
||||
* @returns {string} MD5 hash of the input data
|
||||
*/
|
||||
function getMd5Hash(data) {
|
||||
return crypto
|
||||
.createHash('md5')
|
||||
.update(new Uint8Array(data))
|
||||
.digest('hex');
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies the WASM binaries from the sillytavern-transformers package to the dist folder.
|
||||
*/
|
||||
function copyWasmFiles() {
|
||||
if (!fs.existsSync('./dist')) {
|
||||
fs.mkdirSync('./dist');
|
||||
}
|
||||
|
||||
const listDir = fs.readdirSync('./node_modules/sillytavern-transformers/dist');
|
||||
|
||||
for (const file of listDir) {
|
||||
if (file.endsWith('.wasm')) {
|
||||
const sourcePath = `./node_modules/sillytavern-transformers/dist/${file}`;
|
||||
const targetPath = `./dist/${file}`;
|
||||
|
||||
// Don't copy if the file already exists and is the same checksum
|
||||
if (fs.existsSync(targetPath)) {
|
||||
const sourceChecksum = getMd5Hash(fs.readFileSync(sourcePath));
|
||||
const targetChecksum = getMd5Hash(fs.readFileSync(targetPath));
|
||||
|
||||
if (sourceChecksum === targetChecksum) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
fs.copyFileSync(sourcePath, targetPath);
|
||||
console.log(`${file} successfully copied to ./dist/${file}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
// 0. Convert config.conf to config.yaml
|
||||
convertConfig();
|
||||
// 1. Create default config files
|
||||
createDefaultFiles();
|
||||
// 2. Add missing config values
|
||||
addMissingConfigValues(path.join(process.cwd(), './config.yaml'));
|
||||
// 2. Copy transformers WASM binaries from node_modules
|
||||
copyWasmFiles();
|
||||
// 3. Add missing config values
|
||||
addMissingConfigValues();
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
@@ -55,14 +55,11 @@
|
||||
|
||||
/* Flashing for highlighting animation */
|
||||
@keyframes flash {
|
||||
0%,
|
||||
50%,
|
||||
100% {
|
||||
0%, 50%, 100% {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
25%,
|
||||
75% {
|
||||
25%, 75% {
|
||||
opacity: 0.2;
|
||||
}
|
||||
}
|
||||
|
@@ -1,3 +1,4 @@
|
||||
|
||||
#rm_print_characters_block.group_overlay_mode_select .character_select {
|
||||
transition: background-color 0.4s ease;
|
||||
background-color: rgba(170, 170, 170, 0.15);
|
||||
@@ -27,10 +28,7 @@
|
||||
height: 0 !important;
|
||||
}
|
||||
|
||||
#character_context_menu.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#character_context_menu.hidden { display: none; }
|
||||
#character_context_menu {
|
||||
position: absolute;
|
||||
padding: 3px;
|
||||
|
@@ -1,149 +0,0 @@
|
||||
.dataMaidDialogContainer {
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.dataMaidDialog {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.dataMaidDialogHeader {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
align-items: center;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.dataMaidHeaderInfo {
|
||||
flex: 1;
|
||||
margin: 0;
|
||||
padding: 5px 10px;
|
||||
}
|
||||
|
||||
.dataMaidTextView {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-family: var(--monoFontFamily);
|
||||
resize: none;
|
||||
font-size: 0.95em;
|
||||
}
|
||||
|
||||
.dataMaidImageView {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.dataMaidSpinner {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.dataMaidPlaceholder {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-size: 1.05em;
|
||||
}
|
||||
|
||||
.dataMaidResultsList:empty {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dataMaidResultsList {
|
||||
text-align: left;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 2px;
|
||||
overflow-y: auto;
|
||||
height: 100%;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.dataMaidCategory {
|
||||
border: 1px solid var(--SmartThemeBorderColor);
|
||||
border-radius: 10px;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.dataMaidCategoryHeader {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-right: 5px;
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
.dataMaidCategoryDetails {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1px;
|
||||
}
|
||||
|
||||
.dataMaidCategoryName {
|
||||
flex: 3;
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
.dataMaidCategoryInfo {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.dataMaidCategoryContent {
|
||||
border: 1px solid var(--SmartThemeBorderColor);
|
||||
padding: 5px;
|
||||
border-radius: 10px;
|
||||
background-color: var(--black30a);
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.dataMaidCategoryContent>.info-block {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.dataMaidItem {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 5px;
|
||||
width: 100%;
|
||||
border-bottom: 1px solid var(--SmartThemeBorderColor);
|
||||
}
|
||||
|
||||
.dataMaidItem:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.dataMaidItemHeader {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.dataMaidItemName {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
align-items: baseline;
|
||||
gap: 2px;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.dataMaidItemActions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.dataMaidItemActions>button {
|
||||
font-size: 0.9em;
|
||||
}
|
@@ -146,15 +146,3 @@ input.extension_missing[type="checkbox"] {
|
||||
.extensions_info .extension_actions {
|
||||
flex-wrap: nowrap;
|
||||
}
|
||||
|
||||
.extensions_toolbar {
|
||||
top: 0;
|
||||
position: sticky;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
background-color: var(--SmartThemeBlurTintColor);
|
||||
gap: 5px;
|
||||
z-index: 1;
|
||||
margin-bottom: 10px;
|
||||
padding: 5px;
|
||||
}
|
||||
|
@@ -88,4 +88,4 @@
|
||||
max-height: 50%;
|
||||
width: 50%;
|
||||
height: 50%;
|
||||
}
|
||||
}
|
@@ -76,7 +76,7 @@
|
||||
background-color: rgba(255, 0, 50, 0.4);
|
||||
}
|
||||
|
||||
.logprobs_output_prefix:hover~.logprobs_output_prefix {
|
||||
.logprobs_output_prefix:hover ~ .logprobs_output_prefix {
|
||||
background-color: rgba(255, 0, 50, 0.4);
|
||||
}
|
||||
|
||||
@@ -115,8 +115,7 @@
|
||||
background-color: rgba(255, 255, 0, 0.05);
|
||||
}
|
||||
|
||||
.logprobs_tint_0:hover,
|
||||
.logprobs_tint_0.selected {
|
||||
.logprobs_tint_0:hover, .logprobs_tint_0.selected {
|
||||
background-color: rgba(255, 255, 0, 0.4);
|
||||
}
|
||||
|
||||
@@ -124,8 +123,7 @@
|
||||
background-color: rgba(255, 0, 255, 0.05);
|
||||
}
|
||||
|
||||
.logprobs_tint_1:hover,
|
||||
.logprobs_tint_1.selected {
|
||||
.logprobs_tint_1:hover, .logprobs_tint_1.selected {
|
||||
background-color: rgba(255, 0, 255, 0.4);
|
||||
}
|
||||
|
||||
@@ -133,8 +131,7 @@
|
||||
background-color: rgba(0, 255, 255, 0.05);
|
||||
}
|
||||
|
||||
.logprobs_tint_2:hover,
|
||||
.logprobs_tint_2.selected {
|
||||
.logprobs_tint_2:hover, .logprobs_tint_2.selected {
|
||||
background-color: rgba(0, 255, 255, 0.4);
|
||||
}
|
||||
|
||||
@@ -142,7 +139,6 @@
|
||||
background-color: rgba(50, 205, 50, 0.05);
|
||||
}
|
||||
|
||||
.logprobs_tint_3:hover,
|
||||
.logprobs_tint_3.selected {
|
||||
.logprobs_tint_3:hover, .logprobs_tint_3.selected {
|
||||
background-color: rgba(50, 205, 50, 0.4);
|
||||
}
|
||||
|
@@ -25,6 +25,10 @@
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.mes_text img {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#extensions_settings,
|
||||
#extensions_settings2 {
|
||||
width: 100% !important;
|
||||
|
@@ -34,17 +34,9 @@ dialog {
|
||||
}
|
||||
|
||||
/** Popup styles applied to the main popup */
|
||||
.popup--animation-fast {
|
||||
--popup-animation-speed: var(--animation-duration);
|
||||
}
|
||||
|
||||
.popup--animation-slow {
|
||||
--popup-animation-speed: var(--animation-duration-slow);
|
||||
}
|
||||
|
||||
.popup--animation-none {
|
||||
--popup-animation-speed: 0ms;
|
||||
}
|
||||
.popup--animation-fast { --popup-animation-speed: var(--animation-duration); }
|
||||
.popup--animation-slow { --popup-animation-speed: var(--animation-duration-slow); }
|
||||
.popup--animation-none { --popup-animation-speed: 0ms; }
|
||||
|
||||
/* Styling of main popup elements */
|
||||
.popup .popup-body {
|
||||
@@ -198,3 +190,4 @@ body.no-blur .popup[open]::backdrop {
|
||||
/* Fix weird animation issue with font-scaling during popup open */
|
||||
backface-visibility: hidden;
|
||||
}
|
||||
|
||||
|
@@ -359,15 +359,10 @@
|
||||
content: attr(external_piece_text);
|
||||
display: block;
|
||||
width: 100%;
|
||||
font-weight: 500;
|
||||
font-weight: 600;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.completion_prompt_manager_popup_entry_form_control #completion_prompt_manager_popup_entry_form_prompt:disabled {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
#completion_prompt_manager_popup_entry_source_block {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
@@ -87,7 +87,7 @@
|
||||
}
|
||||
|
||||
#rm_group_members:empty::before {
|
||||
content: attr(group_empty_text);
|
||||
content: 'Group is empty';
|
||||
|
||||
font-weight: bolder;
|
||||
width: 100%;
|
||||
@@ -115,7 +115,7 @@
|
||||
}
|
||||
|
||||
#rm_group_add_members:empty::before {
|
||||
content: attr(no_characters_text);
|
||||
content: 'No characters available';
|
||||
|
||||
font-weight: bolder;
|
||||
width: 100%;
|
||||
|
@@ -1,10 +1,7 @@
|
||||
.scrollable-buttons-container {
|
||||
/* Use viewport height instead of fixed pixels */
|
||||
max-height: 50vh;
|
||||
/* Momentum scrolling on iOS */
|
||||
-webkit-overflow-scrolling: touch;
|
||||
/* m-t-1 is equivalent to margin-top: 1rem; */
|
||||
margin-top: 1rem;
|
||||
max-height: 50vh; /* Use viewport height instead of fixed pixels */
|
||||
-webkit-overflow-scrolling: touch; /* Momentum scrolling on iOS */
|
||||
margin-top: 1rem; /* m-t-1 is equivalent to margin-top: 1rem; */
|
||||
flex-shrink: 1;
|
||||
min-height: 0;
|
||||
scrollbar-width: thin;
|
||||
|
@@ -13,7 +13,6 @@
|
||||
backdrop-filter: blur(calc(var(--SmartThemeBlurStrength)*2));
|
||||
color: var(--SmartThemeBodyColor);
|
||||
z-index: 40000;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.select2-container .select2-selection .select2-selection__clear {
|
||||
|
@@ -556,10 +556,6 @@ textarea:disabled {
|
||||
min-width: fit-content;
|
||||
}
|
||||
|
||||
.flexGap2 {
|
||||
gap: 2px;
|
||||
}
|
||||
|
||||
.flexGap5 {
|
||||
gap: 5px;
|
||||
}
|
||||
|
@@ -211,7 +211,6 @@
|
||||
|
||||
.tag_as_folder.right_menu_button {
|
||||
filter: brightness(75%) saturate(0.6);
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.tag_as_folder.right_menu_button:hover,
|
||||
|
@@ -45,11 +45,6 @@ body.square-avatars .avatar img {
|
||||
border-radius: var(--avatar-base-border-radius) !important;
|
||||
}
|
||||
|
||||
body.rounded-avatars .avatar,
|
||||
body.rounded-avatars .avatar img {
|
||||
border-radius: var(--avatar-base-border-radius-rounded) !important;
|
||||
}
|
||||
|
||||
/*char list grid mode*/
|
||||
|
||||
body.charListGrid #rm_print_characters_block {
|
||||
@@ -231,7 +226,6 @@ body.big-avatars .avatars_inline_small .avatar img {
|
||||
body.big-avatars .avatars_inline {
|
||||
max-height: calc(var(--avatar-base-height) * var(--big-avatar-height-factor) + 2 * var(--avatar-base-border-radius));
|
||||
}
|
||||
|
||||
body.big-avatars .avatars_inline.avatars_multiline {
|
||||
max-height: fit-content;
|
||||
}
|
||||
@@ -239,7 +233,6 @@ body.big-avatars .avatars_inline.avatars_multiline {
|
||||
body.big-avatars .avatars_inline.avatars_inline_small {
|
||||
height: calc(var(--avatar-base-height) * var(--big-avatar-height-factor) * var(--inline-avatar-small-factor) + 2 * var(--avatar-base-border-radius));
|
||||
}
|
||||
|
||||
body.big-avatars .avatars_inline.avatars_inline_small.avatars_multiline {
|
||||
height: inherit;
|
||||
}
|
||||
@@ -346,15 +339,10 @@ body.documentstyle #chat .last_mes .swipe_left {
|
||||
body.documentstyle #chat .mes .mesAvatarWrapper,
|
||||
body.documentstyle #chat .mes .mes_block .ch_name .name_text,
|
||||
body.documentstyle #chat .mes .mes_block .ch_name .timestamp,
|
||||
body.documentstyle #chat .mes .mes_block .ch_name .timestamp-icon,
|
||||
body.documentstyle .mes:not(.last_mes) .ch_name .mes_buttons {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
body.documentstyle #chat .mes_block .ch_name {
|
||||
min-height: unset;
|
||||
}
|
||||
|
||||
/*FastUI blur removal*/
|
||||
|
||||
body.no-blur * {
|
||||
@@ -510,15 +498,3 @@ label[for="trim_spaces"]:not(:has(input:checked)) small {
|
||||
#banned_tokens_block_ooba:not(:has(#send_banned_tokens_textgenerationwebui:checked)) #banned_tokens_controls_ooba {
|
||||
filter: brightness(0.5);
|
||||
}
|
||||
|
||||
#bind_preset_to_connection:checked~.toggleOff {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#bind_preset_to_connection:not(:checked)~.toggleOn {
|
||||
display: none;
|
||||
}
|
||||
|
||||
label[for="bind_preset_to_connection"]:has(input:checked) {
|
||||
color: var(--active);
|
||||
}
|
||||
|
@@ -1,229 +0,0 @@
|
||||
#chat .mes[type="assistant_message"] .mes_button {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.welcomePanel {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
padding: 10px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.welcomePanel:has(.showMoreChats) {
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.welcomePanel.recentHidden .welcomeRecent,
|
||||
.welcomePanel.recentHidden .recentChatsTitle,
|
||||
.welcomePanel.recentHidden .hideRecentChats,
|
||||
.welcomePanel:not(.recentHidden) .showRecentChats {
|
||||
display: none;
|
||||
}
|
||||
|
||||
body.bubblechat .welcomePanel {
|
||||
border-radius: 10px;
|
||||
background-color: var(--SmartThemeBotMesBlurTintColor);
|
||||
border: 1px solid var(--SmartThemeBorderColor);
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
body.hideChatAvatars .welcomePanel .recentChatList .recentChat .avatar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.welcomePanel .welcomeHeader {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.welcomePanel .recentChatsTitle {
|
||||
flex-grow: 1;
|
||||
font-size: calc(var(--mainFontSize) * 1.15);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.welcomePanel .welcomeHeaderTitle {
|
||||
margin: 0;
|
||||
flex-grow: 1;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.welcomePanel .welcomeHeaderVersionDisplay {
|
||||
font-size: calc(var(--mainFontSize) * 1.3);
|
||||
font-weight: 600;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.welcomePanel .welcomeHeaderLogo {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
.welcomePanel .welcomeShortcuts {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.welcomePanel .welcomeShortcuts .welcomeShortcutsSeparator {
|
||||
margin: 0 2px;
|
||||
color: var(--SmartThemeBorderColor);
|
||||
font-size: calc(var(--mainFontSize) * 1.1);
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
gap: 2px;
|
||||
}
|
||||
|
||||
.welcomeRecent .welcomePanelLoader {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex: 1;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.welcomePanel .recentChatList .noRecentChat {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
align-items: baseline;
|
||||
gap: 5px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .recentChat {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
padding: 5px 10px;
|
||||
border-radius: 10px;
|
||||
cursor: pointer;
|
||||
gap: 10px;
|
||||
border: 1px solid var(--SmartThemeBorderColor);
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .recentChat .avatar {
|
||||
flex: 0;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .recentChat:hover {
|
||||
background-color: var(--white30a);
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .recentChat .recentChatInfo {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-wrap: nowrap;
|
||||
flex-grow: 1;
|
||||
overflow: hidden;
|
||||
justify-content: center;
|
||||
align-self: flex-start;
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .recentChat .chatNameContainer {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
align-items: baseline;
|
||||
font-size: calc(var(--mainFontSize) * 1);
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .recentChat .chatNameContainer .chatName {
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .recentChat .chatActions {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .recentChat .chatActions button {
|
||||
margin: 0;
|
||||
font-size: 0.8em;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .recentChat .chatMessageContainer {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 5px;
|
||||
font-size: calc(var(--mainFontSize) * 0.85);
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .recentChat .chatMessageContainer .chatMessage {
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 2;
|
||||
line-clamp: 2;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
body.big-avatars .welcomeRecent .recentChatList .recentChat .chatMessageContainer .chatMessage {
|
||||
-webkit-line-clamp: 4;
|
||||
line-clamp: 4;
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .recentChat .chatStats {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-end;
|
||||
align-items: baseline;
|
||||
align-self: flex-start;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .recentChat .chatStats .counterBlock {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: baseline;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .recentChat .chatStats .counterBlock::after {
|
||||
content: "|";
|
||||
color: var(--SmartThemeBorderColor);
|
||||
font-size: calc(var(--mainFontSize) * 0.95);
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .recentChat.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .showMoreChats {
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.welcomeRecent .recentChatList .showMoreChats.rotated {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1000px) {
|
||||
.welcomePanel .welcomeShortcuts a span {
|
||||
display: none;
|
||||
}
|
||||
}
|
@@ -124,10 +124,6 @@
|
||||
cursor: initial;
|
||||
}
|
||||
|
||||
.world_entry .inline-drawer-header-pointer {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.world_entry .killSwitch {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
11
public/global.d.ts
vendored
11
public/global.d.ts
vendored
@@ -55,15 +55,4 @@ declare global {
|
||||
* @param provider Translation provider
|
||||
*/
|
||||
async function translate(text: string, lang: string, provider: string = null): Promise<string>;
|
||||
|
||||
interface ConvertVideoArgs {
|
||||
buffer: Uint8Array;
|
||||
name: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a video file to an animated WebP format using FFmpeg.
|
||||
* @param args - The arguments for the conversion function.
|
||||
*/
|
||||
function convertVideoToAnimatedWebp(args: ConvertVideoArgs): Promise<Uint8Array>;
|
||||
}
|
||||
|
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 34 KiB |
@@ -1,26 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg version="1.1" viewBox="0 0 21.773 24.84" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m21.576 14.91a1 1 0 0 0-1.4-0.22l-9.29 6.86v0.29a1 1 0 1 1 0 1.91v0.05a1 1 0 0 0 0.6-0.19l9.88-7.3a1 1 0 0 0 0.21-1.4z"/>
|
||||
<path d="m10.886 23.75a1 1 0 1 1 0-1.91v-0.29l-9.29-6.86a1 1 0 0 0-1.4 0.22 1 1 0 0 0 0.21 1.4l9.89 7.3a1 1 0 0 0 0.59 0.19z"/>
|
||||
<path d="m10.886 20.84a2 2 0 1 0 2 2 2 2 0 0 0-2-2zm0 2.91a1 1 0 1 1 1-0.95 1 1 0 0 1-1 0.95z"/>
|
||||
<path d="m2.8864 4.52a1 1 0 0 1-1-1v-2.51a1 1 0 1 1 2 0v2.51a1 1 0 0 1-1 1z"/>
|
||||
<circle cx="2.8564" cy="12.38" r="1.01"/>
|
||||
<circle cx="2.8564" cy="9.43" r="1.01"/>
|
||||
<circle cx="2.8564" cy="6.47" r="1.01"/>
|
||||
<path d="m18.886 7.45a1 1 0 0 1-1-1v-2.52a1 1 0 0 1 2 0v2.52a1 1 0 0 1-1 1z"/>
|
||||
<circle cx="18.916" cy="12.39" r="1.01"/>
|
||||
<circle cx="18.916" cy="9.4" r="1.01"/>
|
||||
<circle cx="18.916" cy="1.01" r="1.01"/>
|
||||
<path d="m10.886 16.38a1 1 0 0 1-1-1v-2.54a1 1 0 0 1 2 0v2.54a1 1 0 0 1-1 1z"/>
|
||||
<circle cx="10.886" cy="18.31" r="1.01"/>
|
||||
<circle cx="10.886" cy="9.89" r="1.01"/>
|
||||
<circle cx="10.886" cy="6.94" r="1.01"/>
|
||||
<path d="m14.886 10.43a1 1 0 0 1-1-1v-2.51a1 1 0 1 1 2 0v2.51a1 1 0 0 1-1 1z"/>
|
||||
<circle cx="14.906" cy="3.96" r="1.01"/>
|
||||
<circle cx="14.906" cy="15.3" r="1.01"/>
|
||||
<circle cx="14.906" cy="12.35" r="1.01"/>
|
||||
<circle cx="6.8664" cy="15.3" r="1.01"/>
|
||||
<circle cx="6.8664" cy="6.94" r="1.01"/>
|
||||
<circle cx="6.8664" cy="3.96" r="1.01"/>
|
||||
<path d="m6.8864 13.38a1 1 0 0 1-1-1v-2.54a1 1 0 0 1 2 0v2.54a1 1 0 0 1-1 1z"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.5 KiB |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user