🎨 优化扩展模块,完成ai接入和对话功能

This commit is contained in:
2026-02-12 23:12:28 +08:00
parent 4e611d3a5e
commit 572f3aa15b
779 changed files with 194400 additions and 3136 deletions

View File

@@ -0,0 +1,115 @@
<div class="adminTabs wide100p">
<nav class="adminNav flex-container alignItemsCenter justifyCenter">
<button type="button" class="manageUsersButton menu_button menu_button_icon" data-target-tab="usersList">
<h4 data-i18n="Manager Users">Manage Users</h4>
</button>
<button type="button" class="newUserButton menu_button menu_button_icon" data-target-tab="registerNewUserBlock">
<h4 data-i18n="New User">New User</h4>
</button>
</nav>
<div class="userAccountTemplate template_element">
<div class="flex-container userAccount alignItemsCenter flexGap10">
<div class="flex-container flexFlowColumn alignItemsCenter flexNoGap">
<div class="avatar" title="If a custom avatar is not set, the user's default persona image will be displayed.">
<img src="img/ai4.png" alt="avatar">
</div>
<div class="flex-container alignItemsCenter">
<div class="userAvatarChange right_menu_button" title="Set a custom avatar.">
<i class="fa-fw fa-solid fa-image"></i>
</div>
<div class="userAvatarRemove right_menu_button" title="Remove a custom avatar.">
<i class="fa-fw fa-solid fa-trash"></i>
</div>
</div>
<form>
<input type="file" class="avatarUpload" accept="image/*" hidden>
</form>
</div>
<div class="flex1 flex-container flexFlowColumn flexNoGap justifyLeft">
<div class="flex-container flexGap10 alignItemsCenter">
<i class="hasPassword fa-solid fa-lock" title="This account is password protected."></i>
<i class="noPassword fa-solid fa-lock-open" title="This account is not password protected."></i>
<h3 class="userName margin0"></h3>
<small class="userHandle">&nbsp;</small>
</div>
<div class="flex-container flexFlowColumn flexNoGap">
<span>
<span data-i18n="Role:">Role:</span>
<span class="userRole"></span>
</span>
<span>
<span data-i18n="Status:">Status:</span>
<span class="userStatus">&nbsp;</span>
</span>
<span>
<span data-i18n="Created:">Created:</span>
<span class="userCreated">&nbsp;</span>
</span>
</div>
</div>
<div class="flex-container flexFlowColumn">
<div class="flex-container">
<div class="userChangeNameButton menu_button" title="Change user display name.">
<i class="fa-fw fa-solid fa-pencil"></i>
</div>
<div class="userEnableButton menu_button" title="Enable user account.">
<i class="fa-fw fa-solid fa-check"></i>
</div>
<div class="userDisableButton menu_button" title="Disable user account.">
<i class="fa-fw fa-solid fa-ban"></i>
</div>
<div class="userPromoteButton menu_button" title="Promote user to admin.">
<i class="fa-fw fa-solid fa-arrow-up"></i>
</div>
<div class="userDemoteButton menu_button" title="Demote user to regular user.">
<i class="fa-fw fa-solid fa-arrow-down"></i>
</div>
</div>
<div class="flex-container">
<div class="userBackupButton menu_button menu_button_icon" title="Download a backup of user data.">
<i class="fa-fw fa-solid fa-download"></i>
</div>
<div class="userChangePasswordButton menu_button" title="Change user password.">
<i class="fa-fw fa-solid fa-key"></i>
</div>
<div class="userDelete menu_button warning" title="Delete user account.">
<i class="fa-fw fa-solid fa-trash"></i>
</div>
</div>
</div>
</div>
</div>
<div class="navTab usersList flex-container flexFlowColumn">
</div>
<div class="navTab registerNewUserBlock" style="display: none;">
<form class="flex-container flexFlowColumn flexGap10 userCreateForm" action="javascript:void(0);">
<div class="flex-container flexNoGap">
<span data-i18n="Display Name:">Display Name:</span>
<span class="warning">*</span>
<input name="_name" class="createUserDisplayName text_pole" type="text" placeholder="e.g. John Snow" autocomplete="username">
</div>
<div class="flex-container flexNoGap">
<span data-i18n="User Handle:">User Handle:</span>
<span class="warning">*</span>
<input name="handle" class="createUserHandle text_pole" placeholder="e.g. john-snow (lowercase letters, numbers, and dashes only)" type="text" pattern="[a-z0-9-]+">
</div>
<div class="flex-container flexNoGap">
<span data-i18n="Password:">Password:</span>
<input name="password" class="createUserPassword text_pole" type="password" placeholder="[ No password ]" autocomplete="new-password">
</div>
<div class="flex-container flexNoGap">
<span data-i18n="Confirm Password:">Confirm Password:</span>
<input name="confirm" class="createUserConfirmPassword text_pole" type="password" placeholder="[ No password ]" autocomplete="new-password">
</div>
<span data-i18n="This will create a new subfolder...">
This will create a new subfolder in the /data/ directory with the user's handle as the folder name.
</span>
<div class="flex-container justifyCenter">
<button type="submit" class="menu_button menu_button_icon newUserRegisterFinalizeButton">
<i class="fa-fw fa-solid fa-user-plus"></i>
<span data-i18n="Create">Create</span>
</button>
</div>
</form>
</div>
</div>

View File

@@ -0,0 +1,13 @@
<div data-type="assistant_note">
<div class="assistant_note_title">
<b data-i18n="Note:">Note:</b> <span data-i18n="this chat is temporary and will be deleted as soon as you leave it.">this chat is temporary and will be deleted as soon as you leave it.</span>
</div>
<button class="assistant_note_import menu_button menu_button_icon margin0" data-i18n="[title]Import from JSONL" title="Import from JSONL">
<i class="fa-solid fa-file-import"></i>
<span data-i18n="Load">Load</span>
</button>
<button class="assistant_note_export menu_button menu_button_icon margin0" data-i18n="[title]Export as JSONL" title="Export as JSONL">
<i class="fa-solid fa-file-export"></i>
<span data-i18n="Save">Save</span>
</button>
</div>

View File

@@ -0,0 +1,5 @@
<div class="flex-container">
<h3 data-i18n="Enter a new display name:">
Enter a new display name:
</h3>
</div>

View File

@@ -0,0 +1,14 @@
<form action="javascript:void(0);" class="flex-container flexFlowColumn">
<div class="currentPasswordBlock">
<label data-i18n="Current Password:" for="user">Current Password:</label>
<input type="password" name="current" class="text_pole" placeholder="[ No password ]" autocomplete="current-password">
</div>
<div class="newPasswordBlock">
<label data-i18n="New Password:" for="password">New Password:</label>
<input type="password" name="password" class="text_pole" placeholder="[ No password ]" autocomplete="new-password">
</div>
<div class="confirmPasswordBlock">
<label data-i18n="Confirm New Password:" for="confirm">Confirm New Password:</label>
<input type="password" name="confirm" class="text_pole" placeholder="[ No password ]" autocomplete="new-password">
</div>
</form>

View File

@@ -0,0 +1,22 @@
<h3><span data-i18n="Import Tags For _begin">Import Tags For </span>{{charName}}<span data-i18n="Import Tags For _end"></span></h3>
<div class="import_avatar_placeholder"></div>
<div class="import_tags_content justifyLeft">
<small data-i18n="Click remove on any tag to remove it from this import.&lt;br /&gt;Select one of the import options to finish importing the tags.">
Click remove on any tag to remove it from this import.<br />
Select one of the import options to finish importing the tags.
</small>
<h4 class="m-t-1" data-i18n="Existing Tags">Existing Tags</h4>
<div id="import_existing_tags_list" class="tags" style="min-height: 20px;"></div>
<h4 class="m-t-1" data-i18n="New Tags">New Tags</h4>
<div id="import_new_tags_list" class="tags" style="min-height: 20px;"></div>
<div id="folder_tags_block" class="m-t-1">
<h4 data-i18n="Folder Tags">Folder Tags</h4>
<small data-i18n="The following tags will be auto-imported based on the currently selected folders">
The following tags will be auto-imported based on the currently selected folders
</small>
<div id="import_folder_tags_list" class="tags" style="margin-top: 5px;"></div>
</div>
</div>

View File

@@ -0,0 +1,5 @@
<!-- I18n data for tools used to auto generate translations -->
<div data-i18n="Import None">Import None</div>
<div data-i18n="Import All">Import All</div>
<div data-i18n="Import Existing">Import Existing</div>
<div data-i18n="Import">Import</div>

View File

@@ -0,0 +1,18 @@
<div class="chat_world range-block flexFlowColumn flex-container">
<div class="range-block-title">
<h4 data-i18n="Chat Lorebook"><!-- This data-i18n attribute is kept for backward compatibility, use the ones below when translating -->
<span data-i18n="Chat Lorebook for">Chat Lorebook for</span> <span class="chat_name"></span>
</h4>
</div>
<div class="range-block-counter justifyLeft flex-container flexFlowColumn margin-bot-10px">
<span data-i18n="chat_world_template_txt">
A selected World Info will be bound to this chat. When generating an AI reply,
it will be combined with the entries from global and character lorebooks.
</span>
</div>
<div class="range-block-range wide100p">
<select class="chat_world_info_selector wide100p">
<option value="">--- None ---</option>
</select>
</div>
</div>

View File

@@ -0,0 +1,6 @@
<h3 data-i18n="chat_rename_1">Enter the new name for the chat:</h3>
<small>
<span data-i18n="chat_rename_2">!!Using an existing filename will produce an error!!</span><br>
<span data-i18n="chat_rename_3">This will break the link between checkpoint chats.</span><br>
<span data-i18n="chat_rename_4">No need to add '.jsonl' at the end.</span><br>
</small>

View File

@@ -0,0 +1,8 @@
<div>
<span class="margin-right-10px" data-i18n="Enter Checkpoint Name:">Enter Checkpoint Name:</span><small data-i18n="(Leave empty to auto-generate)">(Leave empty to auto-generate)</small>
</div>
{{#if isReplace}}
<div class="m-t-1">
<small data-i18n="The currently existing checkpoint will be unlinked and replaced with the new checkpoint, but can still be found in the Chat Management.">The currently existing checkpoint will be unlinked and replaced with the new checkpoint, but can still be found in the Chat Management.</small>
</div>
{{/if}}

View File

@@ -0,0 +1,15 @@
<div class="flex-container flexFlowColumn height100p">
<h3 data-i18n="Additional Parameters">Additional Parameters</h3>
<div class="flex1 flex-container flexFlowColumn">
<h4 data-i18n="Include Body Parameters">Include Body Parameters</h4>
<textarea id="custom_include_body" class="flex1" placeholder="Parameters to be included in the Chat Completion request body (YAML object)&#10;&#10;Example:&#10;top_k: 20&#10;repetition_penalty: 1.1" data-i18n="[placeholder]custom_include_body_desc"></textarea>
</div>
<div class="flex1 flex-container flexFlowColumn">
<h4 data-i18n="Exclude Body Parameters">Exclude Body Parameters</h4>
<textarea id="custom_exclude_body" class="flex1" placeholder="Parameters to be excluded from the Chat Completion request body (YAML array)&#10;&#10;Example:&#10;- frequency_penalty&#10;- presence_penalty" data-i18n="[placeholder]custom_exclude_body_desc"></textarea>
</div>
<div class="flex1 flex-container flexFlowColumn">
<h4 data-i18n="Include Request Headers">Include Request Headers</h4>
<textarea id="custom_include_headers" class="flex1" placeholder="Additional headers for Chat Completion requests (YAML object)&#10;&#10;Example:&#10;CustomHeader: custom-value&#10;AnotherHeader: custom-value" data-i18n="[placeholder]custom_include_headers_desc"></textarea>
</div>
</div>

View File

@@ -0,0 +1,68 @@
<div class="dataMaidCategory inline-drawer">
<div class="inline-drawer-toggle inline-drawer-header">
<div class="dataMaidCategoryHeader">
<div class="dataMaidCategoryDetails">
<div class="dataMaidCategoryName" data-i18n="{{name}}">
{{name}}
</div>
<small>{{description}}</small>
<div class="dataMaidCategoryInfo">
<small>
<i class="fa-solid fa-file-alt fa-sm"></i>
{{totalItems}}
</small>
<span>&VerticalBar;</span>
<small>
<i class="fa-solid fa-hdd fa-sm"></i>
{{totalSize}}
</small>
</div>
</div>
<div class="dataMaidDeleteAll right_menu_button" title="Delete all items in this category" data-i18n="[title]Delete all items in this category">
<i class="fa-solid fa-fw fa-broom"></i>
</div>
</div>
<div class="fa-solid fa-circle-chevron-down inline-drawer-icon down"></div>
</div>
<div class="dataMaidCategoryContent inline-drawer-content">
<div class="flex-container">
{{#each items}}
{{#with this}}
<div class="dataMaidItem" data-hash="{{hash}}">
<div class="dataMaidItemHeader">
<div class="dataMaidItemName">
{{#if parent}}
<span class="dataMaidItemParent">({{parent}})</span>
<span>/</span>
{{/if}}
<b>{{name}}</b>
</div>
<div class="dataMaidItemActions">
<button class="dataMaidItemView menu_button menu_button_icon margin0" title="View item content" data-i18n="[title]View item content">
<i class="fa-solid fa-fw fa-eye"></i>
</button>
<button class="dataMaidItemDownload menu_button menu_button_icon margin0" title="Download item" data-i18n="[title]Download item">
<i class="fa-solid fa-fw fa-download"></i>
</button>
<button class="dataMaidItemDelete menu_button menu_button_icon margin0" title="Delete this item" data-i18n="[title]Delete this item">
<i class="fa-solid fa-fw fa-trash-alt"></i>
</button>
</div>
</div>
<div class="dataMaidItemInfo">
<small>
<i class="fa-solid fa-file fa-sm"></i>
{{size}}
</small>
<span>&VerticalBar;</span>
<small>
<i class="fa-solid fa-calendar fa-sm"></i>
{{date}}
</small>
</div>
</div>
{{/with}}
{{/each}}
</div>
</div>
</div>

View File

@@ -0,0 +1,25 @@
<div class="dataMaidDialog">
<div class="dataMaidDialogHeader">
<div class="dataMaidHeaderInfo info-block warning margin0">
<small data-i18n="Once deleted, the files will be gone forever!">
Once deleted, the files will be gone forever!
</small>
<br>
<small data-i18n="Make sure to back up your data in advance.">
Make sure to back up your data in advance.
</small>
</div>
<button class="menu_button menu_button_icon dataMaidStartButton">
<i class="fa fa-cog"></i>
<span data-i18n="Scan">Scan</span>
</button>
</div>
<hr>
<div class="dataMaidPlaceholder" data-i18n="No results yet. Tap 'Scan' to start scanning.">
No results yet. Tap 'Scan' to start scanning.
</div>
<div class="displayNone dataMaidSpinner">
<i class="fa-solid fa-spinner fa-spin fa-3x"></i>
</div>
<div class="dataMaidResultsList"></div>
</div>

View File

@@ -0,0 +1,27 @@
<div>
<h3 data-i18n="Debug Menu">Debug Menu</h3>
<div data-i18n="Functions in this category are for advanced users only. Don't click anything if you're not sure about the consequences.">
Functions in this category are for advanced users only. Don't click anything if you're not sure about the consequences.
</div>
<table id="debug_table" class="responsiveTable">
{{#each functions}}
{{#with this}}
<tr>
<td>
<div class="justifyLeft">
<b>{{this.name}}</b>
</div>
<div class="justifyLeft">
{{this.description}}
</div>
<div class="flex-container justifyCenter">
<div class="menu_button menu_button_icon" data-debug-function="{{this.functionId}}" data-i18n="Execute">
Execute
</div>
</div>
</td>
</tr>
{{/with}}
{{/each}}
</table>
</div>

View File

@@ -0,0 +1,5 @@
<b><span data-i18n="THIS IS PERMANENT!">THIS IS PERMANENT!</span><br><br>
<label for="del_char_checkbox" class="checkbox_label justifyCenter">
<input type="checkbox" id="del_char_checkbox" />
<small data-i18n="Also delete the chat files">Also delete the chat files</small>
</label></b>

View File

@@ -0,0 +1,9 @@
<h3 data-i18n="Delete Tag">Delete Tag</h3>
<div><span data-i18n="Do you want to delete the tag">Do you want to delete the tag</span> <div id="tag_to_delete" class="tags_inline inline-flex margin-r2"></div>?</div>
<div class="m-t-2 marginBot5" data-i18n="If you want to merge all references to this tag into another tag, select it below:">If you want to merge all references to this tag into another tag, select it below:</div>
<select id="merge_tag_select">
<option value="">--- None ---</option>
{{#each otherTags}}
<option value="{{this.id}}">{{this.name}}</option>
{{/each}}
</select>

View File

@@ -0,0 +1,26 @@
<div class="flex-container flexFlowColumn">
<h3 data-i18n="Are you sure you want to delete this user?">
Are you sure you want to delete this user?
</h3>
<div>
<span data-i18n="Deleting:">Deleting:</span>
<strong id="deleteUserName"></strong>
</div>
<label class="checkbox_label justifyCenter" for="deleteUserData">
<input id="deleteUserData" name="deleteUserData" type="checkbox">
<span data-i18n="Also wipe user data.">Also wipe user data.</span>
</label>
<hr>
<div>
<strong data-i18n="Warning:">Warning:</strong>
<span data-i18n="This action is irreversible.">This action is irreversible.</span>
</div>
<div>
<label for="deleteUserHandle">
<strong data-i18n="Type the user's handle below to confirm:">
Type the user's handle below to confirm:
</strong>
</label>
<input id="deleteUserHandle" name="deleteUserHandle" type="text" class="text_pole" placeholder="[ Type here ]">
</div>
</div>

View File

@@ -0,0 +1,5 @@
<div>
<h3 data-i18n="Are you sure you want to duplicate this character?">Are you sure you want to duplicate this character?</h3>
<span data-i18n="If you just want to start a new chat with the same character...">If you just want to start a new chat with the same character, use "Start new chat" option in the bottom-left options menu.</span>
<br>
</div>

View File

@@ -0,0 +1,7 @@
<div class="text_block empty_block">
<i class="fa-solid {{icon}} fa-4x"></i>
<h1>{{text}}</h1>
<p data-i18n="There are no items to display.">
There are no items to display.
</p>
</div>

View File

@@ -0,0 +1,27 @@
<div class="flex-container flexFlowColumn marginBot10">
<h3 data-i18n="Do you want to export connection data with the preset?">
Do you want to export connection data with the preset?
</h3>
<div data-i18n="This includes the selected source, models, and other preferences set in the API Connections panel.">
This includes the selected source, models, and other preferences set in the API Connections panel.
</div>
<strong data-i18n="Your stored API keys are never exported.">
Your stored API keys are never exported.
</strong>
</div>
<div class="flex-container flexFlowColumn">
<label class="checkbox_label" for="export_connection_data_yes">
<input type="radio" id="export_connection_data_yes" name="export_connection_data" value="true">
<span data-i18n="Export connection data">
Export connection data
</span>
</label>
<label class="checkbox_label" for="export_connection_data_no">
<input type="radio" id="export_connection_data_no" name="export_connection_data" value="false" checked>
<span data-i18n="Do not export connection data">
Do not export connection data
</span>
</label>
</div>

View File

@@ -0,0 +1,24 @@
<div class="forbid_media_override flex-container flexFlowColumn">
<h4 data-i18n="Forbid Media Override explanation" class="margin0">
Ability of the current character/group to use external media in chats.
</h4>
<small data-i18n="Forbid Media Override subtitle" class="marginBot5">
Media: images, videos, audio. External: not hosted on the local server.
</small>
<label class="checkbox_label" for="forbid_media_override_global">
<input type="radio" id="forbid_media_override_global" name="forbid_media_override" />
<span>
<span data-i18n="Use global setting">Use global setting</span>
<b data-i18n="forbid_media_global_state_forbidden" class="forbid_media_global_state_forbidden">(forbidden)</b>
<b data-i18n="forbid_media_global_state_allowed" class="forbid_media_global_state_allowed">(allowed)</b>
</span>
</label>
<label class="checkbox_label" for="forbid_media_override_forbidden">
<input type="radio" id="forbid_media_override_forbidden" name="forbid_media_override" />
<span data-i18n="Always forbidden">Always forbidden</span>
</label>
<label class="checkbox_label" for="forbid_media_override_allowed">
<input type="radio" id="forbid_media_override_allowed" name="forbid_media_override" />
<span data-i18n="Always allowed">Always allowed</span>
</label>
</div>

View File

@@ -0,0 +1,24 @@
<span data-i18n="help_format_1">Text formatting commands:</span>
<ul> <!-- I know it seems like all these 'display as' could fit into just a couple entries, but other languages might need it with their grammar
Actually I feel that languages with SOV might need even more extra entries, but let's KISS it for now, those can be easily added in the future without breaking anything -->
<li><tt data-i18n="help_format_2">*text*</tt> - <span data-i18n="help_format_3">displays as </span><i data-i18n="help_format_4">italics</i></li>
<li><tt data-i18n="help_format_5">**text**</tt> - <span data-i18n="help_format_6">displays as </span><b data-i18n="help_format_7">bold</b></li>
<li><tt data-i18n="help_format_8">***text***</tt> - <span data-i18n="help_format_9">displays as </span><b><i data-i18n="help_format_10">bold italics</i></b></li>
<li><tt data-i18n="help_format_11">__text__</tt> - <span data-i18n="help_format_12">displays as an </span><u data-i18n="help_format_13">underline</u></li>
<li><tt data-i18n="help_format_14">~~text~~</tt> - <span data-i18n="help_format_15">displays as a </span><del data-i18n="help_format_16">strikethough</del></li>
<li><tt data-i18n="help_format_17">[text](url)</tt> - <span data-i18n="help_format_18">displays as a </span><a href="#" data-i18n="help_format_19">hyperlink</a></li>
<li><tt data-i18n="help_format_20">![text](url)</tt> - <span data-i18n="help_format_21">displays as an image</span></li>
<li><tt data-i18n="help_format_22">```text```</tt> - <span data-i18n="help_format_23">displays as a code block (new lines allowed between the backticks)</span></li>
</ul>
<pre><code data-i18n="help_format_like_this"> like this</code></pre>
<ul>
<li><tt data-i18n="help_format_24">`text`</tt> - <span data-i18n="help_format_25">displays as </span><code data-i18n="help_format_26">inline code</code></li>
<li><tt data-i18n="help_format_27">&gt; text</tt> - <span data-i18n="help_format_28">displays as a blockquote (note the space after &gt;)</span></li>
<blockquote data-i18n="help_format_like_this">like this</blockquote>
<li><tt data-i18n="help_format_29"># text</tt> - <span data-i18n="help_format_30">displays as a large header (note the space)</span></li>
<h1 data-i18n="help_format_like_this">like this</h1>
<li><tt data-i18n="help_format_32">## text</tt> - <span data-i18n="help_format_33">displays as a medium header (note the space)</span></li>
<h2 data-i18n="help_format_like_this">like this</h2>
<li><tt data-i18n="help_format_35">### text</tt> - <span data-i18n="help_format_36">displays as a small header (note the space)</span></li>
<h3 data-i18n="help_format_like_this">like this</h3>
</ul>

View File

@@ -0,0 +1,27 @@
<div class="flex-container flexFlowColumn">
<h3 data-i18n="Creator's Notes contain CSS style tags. Do you want to apply them just to Creator's Notes or to the entire application?" class="margin0">
Creator's Notes contain CSS style tags. Do you want to apply them just to Creator's Notes or to the entire application?
</h3>
<h4 data-i18n="CAUTION: Malformed styles may cause issues." class="neutral_warning">
CAUTION: Malformed styles may cause issues.
</h4>
<hr>
<small>
<span data-i18n="To change the preference later, use the">
To change the preference later, use the
</span>
<code class="fa-solid fa-palette"></code>
<span data-i18n="button in the Creator's Notes block.">
button in the Creator's Notes block.
</span>
</small>
<textarea class="text_pole textarea_compact monospace" rows="8" readonly></textarea>
<small class="justifyLeft">
<b data-i18n="Note:">
Note:
</b>
<span data-i18n="Class names will be automatically prefixed with 'custom-'.">
Class names will be automatically prefixed with 'custom-'.
</span>
</small>
</div>

View File

@@ -0,0 +1,16 @@
<div class="flex-container flexFlowColumn">
<h3 data-i18n="Choose how to apply CSS style tags if they are defined in Creator's Notes of this character:" class="margin0">
Choose how to apply CSS style tags if they are defined in Creator's Notes of this character:
</h3>
<h4 data-i18n="CAUTION: Malformed styles may cause issues." class="neutral_warning">
CAUTION: Malformed styles may cause issues.
</h4>
<label class="checkbox_label" for="global_styles_forbidden">
<input type="radio" id="global_styles_forbidden" name="global_styles_preference" />
<span data-i18n="Just to Creator's Notes">Just to Creator's Notes</span>
</label>
<label class="checkbox_label" for="global_styles_allowed">
<input type="radio" id="global_styles_allowed" name="global_styles_preference" />
<span data-i18n="Apply to the entire app">Apply to the entire app</span>
</label>
</div>

View File

@@ -0,0 +1,11 @@
<span data-i18n="help_1">Hello there! Please select the help topic you would like to learn more about:</span>
<ul>
<li><a href="#" data-displayHelp="1" data-i18n="help_2">Slash Commands</a> (<span data-i18n="help_or">or</span> <tt>/help slash</tt>)</li>
<li><a href="#" data-displayHelp="2" data-i18n="help_3">Formatting</a> (<span data-i18n="help_or">or</span> <tt>/help format</tt>)</li>
<li><a href="#" data-displayHelp="3" data-i18n="help_4">Hotkeys</a> (<span data-i18n="help_or">or</span> <tt>/help hotkeys</tt>)</li>
<li><a href="#" data-displayHelp="4" data-i18n="help_5">&lcub;&lcub;Macros&rcub;&rcub;</a> (<span data-i18n="help_or">or</span> <tt>/help macros</tt>)</li>
</ul>
<br>
<b>
<span data-i18n="help_6">Still got questions left? The</span> <a target="_blank" href="https://docs.sillytavern.app/" data-i18n="help_7">Official SillyTavern Documentation Website</a><span data-i18n="help_8"> has much more information!</span>
</b>

View File

@@ -0,0 +1,6 @@
<div class="text_block hidden_block">
<small>
<p>{{text}}</p>
<div class="fa-solid fa-circle-info opacity50p" data-i18n="[title]Characters and groups hidden by filters or closed folders" title="Characters and groups hidden by filters or closed folders"></div>
</small>
</div>

View File

@@ -0,0 +1,31 @@
<div>
<strong data-i18n="help_hotkeys_0">Chat Hotkeys</strong>
</div>
<ul>
<li><kbd data-i18n="help_hotkeys_1">Up</kbd> = <span data-i18n="help_hotkeys_2">Edit last message in chat</span></li>
<li><kbd data-i18n="help_hotkeys_3">Ctrl+Up</kbd> = <span data-i18n="help_hotkeys_4">Edit last USER message in chat</span></li>
<li><kbd data-i18n="help_hotkeys_5">Left</kbd> = <span data-i18n="help_hotkeys_6">swipe left</span></li>
<li><kbd data-i18n="help_hotkeys_7">Right</kbd> = <span data-i18n="help_hotkeys_8">swipe right (NOTE: swipe hotkeys only apply without modifiers and are disabled when chatbar has something typed into it)</span></li>
<li><kbd data-i18n="help_hotkeys_9">Enter</kbd> <span data-i18n="help_hotkeys_10">(with chat bar selected)</span> = <span data-i18n="help_hotkeys_10_1">send your message to AI</span></li>
<li><kbd data-i18n="help_hotkeys_11">Ctrl+Enter</kbd> = <span data-i18n="help_hotkeys_12">Regenerate the last AI response</span></li>
<li><kbd data-i18n="help_hotkeys_13">Alt+Enter</kbd> = <span data-i18n="help_hotkeys_14">Continue the last AI response</span></li>
<li><kbd data-i18n="help_hotkeys_15">Escape</kbd> = <span data-i18n="help_hotkeys_16">stop AI response generation, close UI panels, cancel message edit</span></li>
<li><kbd data-i18n="help_hotkeys_17">Ctrl+Shift+Up</kbd> = <span data-i18n="help_hotkeys_18">Scroll to context line</span></li>
<li><kbd data-i18n="help_hotkeys_19">Ctrl+Shift+Down</kbd> = <span data-i18n="help_hotkeys_20">Scroll chat to bottom</span></li>
</ul>
<div>
<strong data-i18n="help_hotkeys_20">Markdown Hotkeys</strong>
</div>
<div>
<small>
<span data-i18n="help_hotkeys_21">Works in the chatbar and textareas marked with this icon:</span>
<code><i class="fa-brands fa-markdown"></i></code>
</small>
</div>
<ul>
<li><kbd>Ctrl+B</kbd> = <span data-i18n="help_hotkeys_22">**bold**</span></li>
<li><kbd>Ctrl+I</kbd> = <span data-i18n="help_hotkeys_23">*italic*</span></li>
<li><kbd>Ctrl+U</kbd> = <span data-i18n="help_hotkeys_24">__underline__</span></li>
<li><kbd>Ctrl+K</kbd> = <span data-i18n="help_hotkeys_25">`inline code`</span></li>
<li><kbd>Ctrl+Shift+~</kbd> = <span data-i18n="help_hotkeys_26">~~strikethrough~~</span></li>
</ul>

View File

@@ -0,0 +1,23 @@
<h3 data-i18n="Import Characters">Import Characters</h3>
<h4 data-i18n="Enter the URL of the content to import">Enter the URL of the content to import</h4>
<div class="sources_list justifyLeft">
<span data-i18n="Supported sources:">Supported sources:</span><br>
<ul class="marginTop5 li-padding-bot5">
<li><span data-i18n="char_import_1">Chub Character (Direct Link or ID)</span><br><span data-i18n="char_import_example">Example:</span> <tt>Anonymous/example-character</tt></li>
<li><span data-i18n="char_import_2">Chub Lorebook (Direct Link or ID)</span><br><span data-i18n="char_import_example">Example:</span> <tt>lorebooks/bartleby/example-lorebook</tt></li>
<li><span data-i18n="char_import_3">JanitorAI Character (Direct Link or UUID)</span><br><span data-i18n="char_import_example">Example:</span> <tt>ddd1498a-a370-4136-b138-a8cd9461fdfe_character-aqua-the-useless-goddess</tt></li>
<li><span data-i18n="char_import_4">Pygmalion.chat Character (Direct Link or UUID)</span><br><span data-i18n="char_import_example">Example:</span> <tt>a7ca95a1-0c88-4e23-91b3-149db1e78ab9</tt></li>
<li><span data-i18n="char_import_5">AICharacterCards.com Character (Direct Link or ID)</span><br><span data-i18n="char_import_example">Example:</span> <tt>AICC/aicharcards/the-game-master</tt></li>
<li><span data-i18n="char_import_6">Direct PNG Link (refer to</span> <code>config.yaml</code><span data-i18n="char_import_7"> for allowed hosts)</span><br><span data-i18n="char_import_example">Example:</span> <tt>https://files.catbox.moe/notarealfile.png</tt></li>
<li><span data-i18n="char_import_8">RisuRealm Character (Direct Link)</span><br><span data-i18n="char_import_example">Example:</span> <tt>https://realm.risuai.net/character/3ca54c71-6efe-46a2-b9d0-4f62df23d712</tt></li>
<li><span data-i18n="char_import_10">Perchance Character (Direct Link or UUID + .gz)</span><br><span data-i18n="char_import_example">Example:</span> <tt>https://perchance.org/ai-character-chat?data=Loreena~cb3a1b531477378db7cad0148ba62d71.gz</tt><br><span data-i18n="char_import_example">Example:</span> <tt>Loreena~cb3a1b531477378db7cad0148ba62d71.gz</tt></li>
</ul>
</div>
<small>
<span data-i18n="Supports importing multiple characters.">
Supports importing multiple characters.
</span>
<span data-i18n="Write each URL or ID into a new line.">
Write each URL or ID into a new line.
</span>
</small>

View File

@@ -0,0 +1,10 @@
<h3 data-i18n="Enter the Git URL of the extension to install">Enter the Git URL of the extension to install</h3>
<br>
<p>
<b data-i18n="Disclaimer:">Disclaimer:</b>
<span data-i18n="Please be aware that using external extensions can have unintended side effects and may pose security risks. Always make sure you trust the source before importing an extension. We are not responsible for any damage caused by third-party extensions.">
Please be aware that using external extensions can have unintended side effects and may pose security risks. Always make sure you trust the source before importing an extension. We are not responsible for any damage caused by third-party extensions.
</span>
</p>
<br>
<p><span data-i18n="Example:">Example:</span> <tt> https://github.com/author/extension-name </tt></p>

View File

@@ -0,0 +1,156 @@
<h3 class="flex-container justifyCenter alignitemscenter">
<span data-i18n="Prompt Itemization">Prompt Itemization</span>
<div id="showRawPrompt" class="fa-solid fa-square-poll-horizontal menu_button" title="Show Raw Prompt" data-i18n="[title]Show Raw Prompt"></div>
<div id="copyPromptToClipboard" class="fa-solid fa-copy menu_button" title="Copy Prompt" data-i18n="[title]Copy Prompt"></div>
<div id="diffPrevPrompt" class="fa-solid fa-code-compare menu_button" title="Show Prompt Differences" data-i18n="[title]Show Prompt Differences"></div>
</h3>
<div>
<div>
<span data-i18n="API/Model:">API/Model:</span> {{mainApiFriendlyName}} {{#if apiUsed}}({{apiUsed}}){{/if}} {{#if modelUsed}}&ndash; {{modelUsed}}{{/if}}
</div>
<div>
<small><span data-i18n="Preset:">Preset:</span> {{presetName}}</small>
<span>|</span>
<small><span data-i18n="Tokenizer:">Tokenizer:</span> {{selectedTokenizer}}</small>
</div>
</div>
<span class="tokenItemizingSubclass" data-i18n="Only the white numbers really matter. All numbers are estimates. Grey color items may not have been included in the context due to certain prompt format settings.">
Only the white numbers really matter. All numbers are estimates.
Grey color items may not have been included in the context due to certain prompt format settings.
</span>
<hr>
<div class="justifyLeft">
<div class="flex-container">
<div class="flex-container flex1 flexFlowColumns flexNoGap wide50p tokenGraph">
<div class="wide100p" style="background-color: grey; height: {{oaiSystemTokensPercentage}}%;"></div>
<div class="wide100p" style="background-color: salmon; height: {{oaiStartTokensPercentage}}%;"></div>
<div class="wide100p" style="background-color: indianred; height: {{storyStringTokensPercentage}}%;"></div>
<div class="wide100p" style="background-color: gold; height: {{worldInfoStringTokensPercentage}}%;"></div>
<div class="wide100p" style="background-color: palegreen; height: {{ActualChatHistoryTokensPercentage}}%;">
</div>
<div class="wide100p" style="background-color: cornflowerblue; height: {{allAnchorsTokensPercentage}}%;">
</div>
<div class="wide100p" style="background-color: mediumpurple; height: {{promptBiasTokensPercentage}}%;">
</div>
</div>
<div class="flex-container wide50p">
<div class="wide100p flex-container flexNoGap flexFlowColumn">
<div class="flex-container wide100p">
<div class="flex1" style="color: grey;"><span data-i18n="System Info:">System Info:</span></div>
<div class="">{{oaiSystemTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Chat Start: </div>
<div class="tokenItemizingSubclass">{{oaiStartTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Main: </div>
<div class="tokenItemizingSubclass">{{oaiMainTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Post-History: </div>
<div class="tokenItemizingSubclass">{{oaiJailbreakTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Auxiliary: </div>
<div class="tokenItemizingSubclass">{{oaiNsfwTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Nudge: </div>
<div class="tokenItemizingSubclass">{{oaiNudgeTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Impersonate: </div>
<div class="tokenItemizingSubclass">{{oaiImpersonateTokens}}</div>
</div>
</div>
<div class="wide100p flex-container flexNoGap flexFlowColumn">
<div class="flex-container wide100p">
<div class="flex1" style="color: indianred;"><span data-i18n="Prompt Tokens:">Prompt Tokens:</span></div>
<div class="">{{oaiPromptTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Description: </div>
<div class="tokenItemizingSubclass">{{charDescriptionTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Personality:</div>
<div class="tokenItemizingSubclass">{{charPersonalityTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Scenario: </div>
<div class="tokenItemizingSubclass">{{scenarioTextTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">
<span>-- Examples:</span>
{{#if examplesCount}}<small>({{examplesCount}})</small>{{/if}}
</div>
<div class="tokenItemizingSubclass">{{examplesStringTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- User Persona:</div>
<div class="tokenItemizingSubclass">{{userPersonaStringTokens}}</div>
</div>
</div>
<div class="wide100p flex-container">
<div class="flex1" style="color: gold;"><span data-i18n="World Info:">World Info:</span></div>
<div class="">{{worldInfoStringTokens}}</div>
</div>
<div class="wide100p flex-container">
<div class="flex1" style="color: palegreen;">
<span data-i18n="Chat History:">Chat History:</span>
{{#if messagesCount}}<small>({{messagesCount}})</small>{{/if}}
</div>
<div class="">{{ActualChatHistoryTokens}}</div>
</div>
<div class="wide100p flex-container flexNoGap flexFlowColumn">
<div class="wide100p flex-container">
<div class="flex1" style="color: cornflowerblue;"><span data-i18n="Extensions:">Extensions:</span></div>
<div class="">{{allAnchorsTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Summarize: </div>
<div class="tokenItemizingSubclass">{{summarizeStringTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Author's Note:</div>
<div class="tokenItemizingSubclass">{{authorsNoteStringTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Smart Context:</div>
<div class="tokenItemizingSubclass">{{smartContextStringTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Vector Storage (Chats):</div>
<div class="tokenItemizingSubclass">{{chatVectorsStringTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Vector Storage (Data Bank):</div>
<div class="tokenItemizingSubclass">{{dataBankVectorsStringTokens}}</div>
</div>
</div>
<div class="wide100p flex-container">
<div class="flex1" style="color: mediumpurple;"><span>&lcub;&lcub;&rcub;&rcub;</span> <span data-i18n="Bias:">Bias:</span></div>
<div class="">{{oaiBiasTokens}}</div>
</div>
</div>
</div>
<hr>
<div class="wide100p flex-container flexFlowColumns">
<div class="flex-container wide100p">
<div class="flex1"><span data-i18n="Total Tokens in Prompt:">Total Tokens in Prompt:</span></div>
<div class="">{{finalPromptTokens}}</div>
</div>
<div class="flex-container wide100p">
<div class="flex1"><span data-i18n="Max Context">Max Context</span>&nbsp;<small data-i18n="(Context Size - Response Length)">(Context Size - Response Length)</small>:</div>
<div class="">{{thisPrompt_max_context}}</div>
</div>
</div>
</div>
<hr>
<div id="rawPromptPopup" class="list-group">
<div id="rawPromptWrapper" class="tokenItemizingMaintext"></div>
</div>

View File

@@ -0,0 +1,136 @@
<h3 class="flex-container justifyCenter alignitemscenter">
Prompt Itemization
<div id="showRawPrompt" class="fa-solid fa-square-poll-horizontal menu_button" title="Show Raw Prompt" data-i18n="[title]Show Raw Prompt"></div>
<div id="copyPromptToClipboard" class="fa-solid fa-copy menu_button" title="Copy Prompt" data-i18n="[title]Copy Prompt"></div>
<div id="diffPrevPrompt" class="fa-solid fa-code-compare menu_button" title="Show Prompt Differences" data-i18n="[title]Show Prompt Differences"></div>
</h3>
<div>
<div>
API/Model: {{mainApiFriendlyName}} {{#if apiUsed}}({{apiUsed}}){{/if}} {{#if modelUsed}}&ndash; {{modelUsed}}{{/if}}
</div>
<div>
<small>Preset: {{presetName}}</small>
<span>|</span>
<small>Tokenizer: {{selectedTokenizer}}</small>
</div>
</div>
<span class="tokenItemizingSubclass">
Only the white numbers really matter. All numbers are estimates.
Grey color items may not have been included in the context due to certain prompt format settings.
</span>
<hr>
<div class="justifyLeft">
<div class="flex-container">
<div class="flex-container flex1 flexFlowColumns flexNoGap wide50p tokenGraph">
<div class="wide100p" style="background-color: indianred; height: {{storyStringTokensPercentage}}%;"></div>
<div class="wide100p" style="background-color: gold; height: {{worldInfoStringTokensPercentage}}%;"></div>
<div class="wide100p" style="background-color: palegreen; height: {{ActualChatHistoryTokensPercentage}}%;">
</div>
<div class="wide100p" style="background-color: cornflowerblue; height: {{allAnchorsTokensPercentage}}%;">
</div>
<div class="wide100p" style="background-color: mediumpurple; height: {{promptBiasTokensPercentage}}%;">
</div>
</div>
<div class="flex-container wide50p">
<div class="wide100p flex-container flexNoGap flexFlowColumn">
<div class="flex-container wide100p">
<div class="flex1" style="color: indianred;"> Character Definitions:</div>
<div class=""> {{storyStringTokens}}</div>
</div>
<div class="flex-container">
<div class=" flex1 tokenItemizingSubclass">-- Description: </div>
<div class="tokenItemizingSubclass">{{charDescriptionTokens}}</div>
</div>
<div class="flex-container">
<div class=" flex1 tokenItemizingSubclass">-- Personality:</div>
<div class="tokenItemizingSubclass"> {{charPersonalityTokens}}</div>
</div>
<div class="flex-container">
<div class=" flex1 tokenItemizingSubclass">-- Scenario: </div>
<div class="tokenItemizingSubclass">{{scenarioTextTokens}}</div>
</div>
<div class="flex-container">
<div class=" flex1 tokenItemizingSubclass">
<span>-- Examples:</span>
{{#if examplesCount}}<small>({{examplesCount}})</small>{{/if}}
</div>
<div class="tokenItemizingSubclass"> {{examplesStringTokens}}</div>
</div>
<div class="flex-container">
<div class=" flex1 tokenItemizingSubclass">-- User Persona:</div>
<div class="tokenItemizingSubclass"> {{userPersonaStringTokens}}</div>
</div>
<div class="flex-container">
<div class=" flex1 tokenItemizingSubclass">-- System Prompt (Instruct):</div>
<div class="tokenItemizingSubclass"> {{instructionTokens}}</div>
</div>
</div>
<div class="wide100p flex-container">
<div class="flex1" style="color: gold;">World Info:</div>
<div class="">{{worldInfoStringTokens}}</div>
</div>
<div class="wide100p flex-container">
<div class="flex1" style="color: palegreen;">
<span data-i18n="Chat History:">Chat History:</span>
{{#if messagesCount}}<small>({{messagesCount}})</small>{{/if}}
</div>
<div class=""> {{ActualChatHistoryTokens}}</div>
</div>
<div class="wide100p flex-container flexNoGap flexFlowColumn">
<div class="wide100p flex-container">
<div class="flex1" style="color: cornflowerblue;">Extensions:</div>
<div class="">{{allAnchorsTokens}}</div>
</div>
<div class="flex-container">
<div class=" flex1 tokenItemizingSubclass">-- Summarize: </div>
<div class="tokenItemizingSubclass">{{summarizeStringTokens}}</div>
</div>
<div class="flex-container">
<div class=" flex1 tokenItemizingSubclass">-- Author's Note:</div>
<div class="tokenItemizingSubclass"> {{authorsNoteStringTokens}}</div>
</div>
<div class="flex-container">
<div class=" flex1 tokenItemizingSubclass">-- Smart Context:</div>
<div class="tokenItemizingSubclass"> {{smartContextStringTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Vector Storage (Chats):</div>
<div class="tokenItemizingSubclass"> {{chatVectorsStringTokens}}</div>
</div>
<div class="flex-container ">
<div class=" flex1 tokenItemizingSubclass">-- Vector Storage (Data Bank):</div>
<div class="tokenItemizingSubclass"> {{dataBankVectorsStringTokens}}</div>
</div>
</div>
<div class="wide100p flex-container">
<div class="flex1" style="color: mediumpurple;">&lcub;&lcub;&rcub;&rcub; Bias:</div>
<div class="">{{promptBiasTokens}}</div>
</div>
</div>
</div>
<hr>
<div class="wide100p flex-container flexFlowColumns">
<div class="flex-container wide100p">
<div class="flex1">Total Tokens in Prompt:</div>
<div class=""> {{totalTokensInPrompt}}</div>
</div>
<div class="flex-container wide100p">
<div class="flex1">Max Context (Context Size - Response Length):</div>
<div class="">{{thisPrompt_max_context}}</div>
</div>
<div class="flex-container wide100p">
<div class="flex1">- Padding:</div>
<div class=""> {{thisPrompt_padding}}</div>
</div>
<div class="flex-container wide100p">
<div class="flex1">Actual Max Context Allowed:</div>
<div class="">{{thisPrompt_actual}}</div>
</div>
</div>
</div>
<hr>
<div id="rawPromptPopup" class="list-group">
<div id="rawPromptWrapper" class="tokenItemizingSubclass"></div>
</div>

View File

@@ -0,0 +1,17 @@
<h3 data-i18n="Choose what to export">
Choose what to export
</h3>
<div class="flex-container flexFlowColumn justifyLeft">
{{#each sections}}
{{#with this}}
<label class="checkbox_label">
{{#if checked}}
<input type="checkbox" value="{{key}}" checked />
{{else}}
<input type="checkbox" value="{{key}}" />
{{/if}}
<span data-i18n="{{name}}">{{name}}</span>
</label>
{{/with}}
{{/each}}
</div>

View File

@@ -0,0 +1,17 @@
<h3 data-i18n="Choose what to import">
Choose what to import
</h3>
<div class="flex-container flexFlowColumn justifyLeft">
{{#each sections}}
{{#with this}}
<label class="checkbox_label">
<input type="checkbox" value="{{key}}" checked>
<span data-i18n="{{name}}">{{name}}</span>
{{#if preset}}
<span>&ndash;</span>
<small>{{preset}}</small>
{{/if}}
</label>
{{/with}}
{{/each}}
</div>

View File

@@ -0,0 +1,27 @@
<h3>
This instruct template also contains a system prompt.
</h3>
<div>
Would you like to migrate the system prompt from the template?
</div>
{{#if existing}}
<div class="marginTopBot5">
<b>Note:</b>
<span>you already have this prompt saved as:</span>
<span>{{existing}}</span>
</div>
{{/if}}
<div class="justifyLeft marginTop5">
<div>
<small>
<b>"Yes"</b> &ndash; The prompt will be imported and selected as a current system prompt.
</small>
</div>
<div>
<small>
<b>"No"</b> &ndash; The prompt will be ignored, no changes to the current system prompt.
</small>
</div>
</div>
<textarea class="wide100p textarea_compact" rows="10">{{prompt}}</textarea>

View File

@@ -0,0 +1,4 @@
<label for="del_chat_checkbox" class="checkbox_label justifyCenter" data-i18n="[title]If necessary, you can later restore this chat file from the /backups folder" title="If necessary, you can later restore this chat file from the /backups folder">
<input type="checkbox" id="del_chat_checkbox" />
<small data-i18n="Also delete the current chat file">Also delete the current chat file</small>
</label>

View File

@@ -0,0 +1,18 @@
<div class="persona_world range-block flexFlowColumn flex-container">
<div class="range-block-title">
<h4>
<span data-i18n="Persona Lorebook for">Persona Lorebook for</span> <span class="persona_name"></span>
</h4>
</div>
<div class="range-block-counter justifyLeft flex-container flexFlowColumn margin-bot-10px">
<span data-i18n="persona_world_template_txt">
A selected World Info will be bound to this persona. When generating an AI reply,
it will be combined with the entries from global, character and chat lorebooks.
</span>
</div>
<div class="range-block-range wide100p">
<select class="persona_world_info_selector wide100p">
<option value="">--- None ---</option>
</select>
</div>
</div>

View File

@@ -0,0 +1,11 @@
<div class="{{prefix}}prompt_manager_footer">
<select id="{{prefix}}prompt_manager_footer_append_prompt" class="text_pole" name="append-prompt">
{{{promptsHtml}}}
</select>
<a class="menu_button fa-chain fa-solid fa-fw" title="Insert prompt" data-i18n="[title]Insert prompt"></a>
<a class="caution menu_button fa-x fa-solid fa-fw" title="Delete prompt" data-i18n="[title]Delete prompt"></a>
<a class="menu_button fa-file-import fa-solid fa-fw" id="prompt-manager-import" title="Import a prompt list" data-i18n="[title]Import a prompt list"></a>
<a class="menu_button fa-file-export fa-solid fa-fw" id="prompt-manager-export" title="Export this prompt list" data-i18n="[title]Export this prompt list"></a>
<a class="menu_button fa-undo fa-solid fa-fw" id="prompt-manager-reset-character" title="Reset current character" data-i18n="[title]Reset current character"></a>
<a class="menu_button fa-plus-square fa-solid fa-fw" title="New prompt" data-i18n="[title]New prompt"></a>
</div>

View File

@@ -0,0 +1,12 @@
<div class="range-block">
{{#if error}}
{{{errorDiv}}}
{{/if}}
<div class="{{prefix}}prompt_manager_header">
<div class="{{prefix}}prompt_manager_header_advanced">
<span data-i18n="Prompts">Prompts</span>
</div>
<div><span data-i18n="Total Tokens:">Total Tokens:</span> {{totalActiveTokens}} </div>
</div>
<ul id="{{prefix}}prompt_manager_list" class="text_pole"></ul>
</div>

View File

@@ -0,0 +1,8 @@
<li class="{{prefix}}prompt_manager_list_head">
<span data-i18n="Name">Name</span>
<span></span>
<span class="prompt_manager_prompt_tokens" data-i18n="Tokens;prompt_manager_tokens">Tokens</span>
</li>
<li class="{{prefix}}prompt_manager_list_separator">
<hr>
</li>

View File

@@ -0,0 +1 @@
<span data-i18n="Are you sure you want to connect to the following proxy URL?">Are you sure you want to connect to the following proxy URL?</span><var>{{proxyURL}}</var>

View File

@@ -0,0 +1,4 @@
<h3><span data-i18n="Encountered an error while processing your request.">Encountered an error while processing your request.</span><br>
<span data-i18n="Check you have credits available on your">Check you have credits available on your</span>
<a href="https://platform.openai.com/account/usage" target="_blank" data-i18n="OpenAI account quora_error">OpenAI account</a><span data-i18n="dot quota_error">.</span><br>
<span data-i18n="If you have sufficient credits, please try again later.">If you have sufficient credits, please try again later.</span></h3>

View File

@@ -0,0 +1,13 @@
<div class="flex-container flexFlowColumn marginBot10">
<h3 data-i18n="Are you sure you want to reset your settings to factory defaults?">
Are you sure you want to reset your settings to factory defaults?
</h3>
<div data-i18n="Don't forget to save a snapshot of your settings before proceeding.">
Don't forget to save a snapshot of your settings before proceeding.
</div>
<hr>
<div data-i18n="Enter your password below to confirm:">
Enter your password below to confirm:
</div>
<input id="resetSettingsPassword" name="password" type="password" class="text_pole" placeholder="Password">
</div>

View File

@@ -0,0 +1,24 @@
<div class="title_restorable flexFlowColumn alignItemsBaseline">
<div class="flex-container justifySpaceBetween alignItemsBaseline wide100p">
<h3 data-i18n="Sampler Select">Sampler Select</h3>
<div class="flex-container alignItemsBaseline">
<div id="resetSelectedSamplers" class="menu_button menu_button_icon" data-i18n="[title]Reset custom sampler selection" title="Reset custom sampler selection">
<i class="fa-solid fa-recycle"></i>
<span data-i18n="Reset">Reset</span>
</div>
<div id="prioritizeManuallySelectedSamplers" class="menu_button menu_button_icon" data-i18n="[title]Prioritize showing samplers manually selected from this popup." title="Prioritize showing samplers manually selected from this popup.">
<i class="fa-solid fa-lock"></i>
<span data-i18n="Prioritize">Prioritize</span>
</div>
<div class="margin5 fa-solid fa-exclamation-circle" data-i18n="[title]Toggle on to force the samplers selected in this menu to be shown when switching to the current API Type (API Connections Panel). By default, SillyTavern automatically selects samplers used or needed by the selected API Type." title="Toggle on to force the samplers selected in this menu to be shown when switching to the current API Type (API Connections Panel). By default, SillyTavern automatically selects samplers used or needed by the selected API Type."></div>
</div>
<!--<div class="flex-container alignItemsBaseline">
<div class="menu_button menu_button_icon" title="Create a new sampler">
<i class="fa-solid fa-plus"></i>
<span data-i18n="Create">Create</span>
</div>
</div>-->
</div>
<small data-i18n="Here you can toggle the display of individual samplers. (WIP)">Here you can toggle the display of individual samplers. (WIP)</small>
</div>
<hr>

View File

@@ -0,0 +1,45 @@
<div class="scenario_override flexFlowColumn flex-container justifyLeft">
<div class="title_restorable alignItemsBaseline">
<h3><span data-i18n="Chat Character Settings Override" class="margin0">Chat Character Settings Override</span></h3>
<div class="menu_button menu_button_icon remove_scenario_override">
<i class="fa-solid fa-trash-can "></i>
<span data-i18n="Remove">Remove</span>
</div>
</div>
<div>
<strong data-i18n="Unique to this chat.">Unique to this chat.</strong>
<span data-group="true" data-i18n="All group members will use the following values instead of what is specified in their character cards.">All group members will use the following values instead of what is specified in their character cards.</span>
<span data-character="true" data-i18n="The following values will be used instead of the value set in the character card.">The following values will be used instead of the value set in the character card.</span>
<span data-i18n="Checkpoints inherit the overrides from their parent, and can be changed individually after that.">Checkpoints inherit the overrides from their parent, and can be changed individually after that.</span>
</div>
<hr>
<div class="wide100p flex-container flexFlowColumn">
<h4 class="flex-container alignItemsBaseline">
<span data-i18n="Scenario">Scenario</span>
<i class="editor_maximize fa-solid fa-maximize right_menu_button" data-for="chat_scenario_override" title="Expand the editor" data-i18n="[title]Expand the editor"></i>
</h4>
<div>
<textarea id="chat_scenario_override" class="chat_scenario text_pole" rows="6" data-i18n="[placeholder]Type Scenario here..." placeholder="Type Scenario here..."></textarea>
</div>
<h4 class="flex-container alignItemsBaseline">
<span data-i18n="Examples of dialogue">Examples of dialogue</span>
<i class="editor_maximize fa-solid fa-maximize right_menu_button" data-for="chat_examples_override" title="Expand the editor" data-i18n="[title]Expand the editor"></i>
</h4>
<div>
<textarea id="chat_examples_override" class="chat_examples text_pole" rows="6" data-i18n="[placeholder]Type Example Messages here..." placeholder="Type Example Messages here..."></textarea>
</div>
<h4 class="flex-container alignItemsBaseline">
<span data-i18n="Main Prompt">Main Prompt</span>
<small>
<small>&mdash;</small>
<i class="fa-solid fa-user-cog"></i>
<b data-i18n="Prefer Char. Prompt">Prefer Char. Prompt</b>
<span data-i18n="MUST be enabled!">MUST be enabled!</span>
</small>
<i class="editor_maximize fa-solid fa-maximize right_menu_button" data-for="chat_system_prompt_override" title="Expand the editor" data-i18n="[title]Expand the editor"></i>
</h4>
<div>
<textarea id="chat_system_prompt_override" class="chat_system_prompt text_pole" rows="6" data-i18n="[placeholder]Type System Prompt here..." placeholder="Type System Prompt here..."></textarea>
</div>
</div>
</div>

View File

@@ -0,0 +1,27 @@
<div class="secretKeyManager">
<div class="secretKeyManagerHeader">
<div class="secretKeyManagerSubtitle">
<div class="secretKeyManagerInfo">
<div class="flex-container">
<div data-i18n="API:">API:</div>
<span>{{name}}</span>
</div>
<div class="flex-container">
<div data-i18n="Key:">Key:</div>
<code>{{key}}</code>
</div>
</div>
<div class="secretKeyManagerActions">
<button class="menu_button menu_button_icon" data-action="add-secret">
<i class="fa-solid fa-plus"></i>
<span data-i18n="Add Secret">Add Secret</span>
</button>
</div>
</div>
</div>
<hr>
<div class="secretKeyManagerList"></div>
<div class="secretKeyManagerListEmpty">
<span data-i18n="No secrets saved.">No secrets saved.</span>
</div>
</div>

View File

@@ -0,0 +1,30 @@
<div class="secretKeyManagerItem {{#if active}}active{{/if}}">
<div class="secretKeyManagerItemInfo">
<div class="secretKeyManagerItemHeader">
<strong>{{label}}</strong>
<small>{{value}}</small>
</div>
<div class="secretKeyManagerItemSubtitle">
<strong>ID:</strong>
<span class="secretKeyManagerItemId" data-action="copy-id" title="Copy ID" data-i18n="[title]Copy ID">{{id}}</span>
</div>
</div>
<div class="secretKeyManagerItemActions">
<div class="secretKeyManagerItemActionsRow">
<button class="menu_button menu_button_icon {{#if active}}disabled{{/if}}" data-action="rotate-secret" data-id="{{id}}" title="Select" data-i18n="[title]Select">
<i class="fa-fw fa-solid fa-check"></i>
</button>
<button class="menu_button menu_button_icon" data-action="copy-secret" data-id="{{id}}" title="Copy" data-i18n="[title]Copy">
<i class="fa-fw fa-solid fa-copy"></i>
</button>
</div>
<div class="secretKeyManagerItemActionsRow">
<button class="menu_button menu_button_icon" data-action="rename-secret" data-id="{{id}}" title="Rename" data-i18n="[title]Rename">
<i class="fa-fw fa-solid fa-pen-to-square"></i>
</button>
<button class="menu_button menu_button_icon" data-action="delete-secret" data-id="{{id}}" title="Delete" data-i18n="[title]Delete">
<i class="fa-fw fa-solid fa-trash"></i>
</button>
</div>
</div>
</div>

View File

@@ -0,0 +1,31 @@
<div class="padding5">
<h3 class="title_restorable">
<span data-i18n="Settings Snapshots">Settings Snapshots</span>
<div class="makeSnapshotButton menu_button menu_button_icon" data-i18n="[title]Record a snapshot of your current settings." title="Record a snapshot of your current settings.">
<i class="fa-fw fa-solid fa-camera"></i>
<span data-i18n="Make a Snapshot">Make a Snapshot</span>
</div>
</h3>
<hr>
<div class="snapshotList flex-container flexFlowColumn">
</div>
<div class="template_element snapshotTemplate">
<div class="snapshot inline-drawer wide100p">
<div class="inline-drawer-toggle inline-drawer-header flexGap10">
<div class="flex-container flexFlowColumn flexNoGap justifyLeft">
<span class="snapshotName"></span>
<div class="flex-container flexGap10">
<small class="snapshotDate"></small>
<small>(<span class="snapshotSize"></span>)</small>
</div>
</div>
<div class="expander"></div>
<div class="menu_button fa-solid fa-recycle snapshotRestoreButton" data-i18n="[title]Restore this snapshot" title="Restore this snapshot"></div>
<div class="fa-solid fa-circle-chevron-down inline-drawer-icon down"></div>
</div>
<div class="inline-drawer-content">
<textarea class="text_pole textarea_compact fontsize80p snapshotContent" readonly placeholder="Loading..." rows="25"></textarea>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,61 @@
<div id="tabby_downloader_popup">
<div>
<h3><strong data-i18n="Download Model">Download Model</strong>
<a href="https://github.com/theroyallab/async-hf-downloader" class="notes-link" target="_blank">
<span class="note-link-span">?</span>
</a>
</h3>
<small class="flex-container extensions_info justifyCenter">
Download a HuggingFace model with TabbyAPI
</small>
<small class="flex-container extensions_info justifyCenter">
(Requires an admin key)
</small>
<hr />
<!-- Model parameter textboxes -->
Repo ID
<div class="flex-container">
<input name="hf_repo_id" class="text_pole" type="text" placeholder="Ex. turboderp/Llama-3-8B-exl2" />
</div>
<div class="range-block-title justifyCenter">
<span data-i18n="Downloader Options">Downloader Options</span>
<div class="margin5 fa-solid fa-circle-info opacity50p " data-i18n="[title]Extra parameters for downloading/HuggingFace API" title="Extra parameters for downloading/HuggingFace API.&#13;If unsure, leave these blank."></div>
</div>
<div class="flex-container">
<div class="flex1">
<label for="revision">
<small data-i18n="Revision">Revision</small>
</label>
<input name="revision" class="text_pole" type="text" placeholder="Ex. 6.0bpw" />
</div>
<div class="flex1">
<label for="folder_name">
<small data-i18n="Folder Name">Output Folder Name</small>
</label>
<input name="folder_name" class="text_pole" type="text" />
</div>
<div class="flex1">
<label for="hf_token">
<small data-i18n="HF Token">HF Token</small>
</label>
<input name="hf_token" class="text_pole" type="text" placeholder="For gated models" />
</div>
</div>
<div class="range-block-title justifyCenter">
<span data-i18n="Include Patterns">Include Patterns</span>
<div class="margin5 fa-solid fa-circle-info opacity50p" data-i18n="[title]Glob patterns of files to include in the download." title="Glob patterns of files to include in the download.&#13;Separate each pattern by a newline."></div>
</div>
<div class="flex-container">
<textarea class="text_pole textarea_compact" name="tabby_download_include" placeholder="Ex. *.txt"></textarea>
</div>
<div class="range-block-title justifyCenter">
<span data-i18n="Exclude Patterns">Exclude Patterns</span>
<div class="margin5 fa-solid fa-circle-info opacity50p" data-i18n="[title]Glob patterns of files to exclude in the download." title="Glob patterns of files to exclude in the download.&#13;Separate each pattern by a newline."></div>
</div>
<div class="flex-container">
<textarea class="text_pole textarea_compact" name="tabby_download_exclude" placeholder="Ex. *.txt"></textarea>
</div>
</div>
</div>

View File

@@ -0,0 +1,36 @@
<div class="title_restorable alignItemsBaseline">
<h3 data-i18n="Tag Management">Tag Management</h3>
<div class="flex-container alignItemsBaseline">
<div class="menu_button menu_button_icon tag_view_prune" data-i18n="[title]Remove unused tags" title="Remove unused tags">
<i class="fa-solid fa-scissors"></i>
<span data-i18n="Prune">Prune</span>
</div>
<div class="menu_button menu_button_icon tag_view_backup" data-i18n="[title]Save your tags to a file" title="Save your tags to a file">
<i class="fa-solid fa-file-export"></i>
<span data-i18n="Backup">Backup</span>
</div>
<div class="menu_button menu_button_icon tag_view_restore" data-i18n="[title]Restore tags from a file" title="Restore tags from a file">
<i class="fa-solid fa-file-import"></i>
<span data-i18n="Restore">Restore</span>
</div>
<div class="menu_button menu_button_icon tag_view_create" data-i18n="[title]Create a new tag" title="Create a new tag">
<i class="fa-solid fa-plus"></i>
<span data-i18n="Create">Create</span>
</div>
<input type="file" id="tag_view_restore_input" hidden accept=".json">
</div>
</div>
<div class="justifyLeft m-b-1">
<div class="flex-container alignItemsBaseline">
<span data-i18n="Sort mode">Sort mode:</span>
<select id="tag_sort_mode_select" class="flex1 text_pole">
<option value="manual" data-i18n="Manual (Drag & Drop)">Manual (Drag & Drop)</option>
<option value="alphabetical" data-i18n="Alphabetical (A-Z)">Alphabetical (A-Z)</option>
<option value="by_entries" data-i18n="Most Used (By Count)">Most Used (By Count)</option>
</select>
</div>
<small>
<span data-i18n="Drag handle to reorder. Click name to rename. Click color to change display.">Drag handle to reorder. Click name to rename. Click color to change display.</span><br>
{{#if bogus_folders}}<span data-i18n="Click on the folder icon to use this tag as a folder.">Click on the folder icon to use this tag as a folder.</span><br>{{/if}}
</small>
</div>

View File

@@ -0,0 +1,4 @@
<div>
<div data-i18n="Are you sure you want to delete the theme?">Are you sure you want to delete the theme?</div>
<b>"{{themeName}}"</b>
</div>

View File

@@ -0,0 +1,3 @@
<div>
This theme contains @import lines in the Custom CSS. Press "Yes" to proceed.
</div>

View File

@@ -0,0 +1,97 @@
<div class="flex-container flexFlowColumn justifyLeft flexGap10">
<div>
<h2 class="marginBot10 flex-container">
<span data-i18n="Hi,">Hi,</span><span class="userName margin0"></span>
<div data-require-accounts class="userChangeNameButton right_menu_button" title="Change display name.">
<i class="fa-fw fa-solid fa-pencil fa-xs"></i>
</div>
</h2>
<div class="accountsDisabledHint" style="display: none;">
<span data-i18n="To enable multi-account features, restart the SillyTavern server with">To enable multi-account features, restart the SillyTavern server with</span> <code>enableUserAccounts</code> <span data-i18n="set to true in the config.yaml file.">set to true in the config.yaml file.</span>
</div>
</div>
<div>
<h3 data-i18n="Account Info">
Account Info
</h3>
<div class="flex-container flexGap10">
<div class="flex-container flexFlowColumn alignItemsCenter flexNoGap">
<div class="avatar" data-i18n="[title]To change your user avatar, use the buttons below or select a default persona in the Persona Management menu." title="To change your user avatar, use the buttons below or select a default persona in the Persona Management menu.">
<img src="img/ai4.png" alt="avatar">
</div>
<div class="flex-container alignItemsCenter">
<div class="userAvatarChange right_menu_button" data-i18n="[title]Set your custom avatar." title="Set your custom avatar.">
<i class="fa-fw fa-solid fa-image"></i>
</div>
<div class="userAvatarRemove right_menu_button" data-i18n="[title]Remove your custom avatar." title="Remove your custom avatar.">
<i class="fa-fw fa-solid fa-trash"></i>
</div>
</div>
<form>
<input type="file" class="avatarUpload" accept="image/*" hidden>
</form>
</div>
<div class="flex1 flex-container flexGap10">
<div class="flex-container flexFlowColumn">
<div>
<span data-i18n="Handle:">Handle:</span>
<span class="userHandle"></span>
</div>
<div>
<span data-i18n="Role:">Role:</span>
<span class="userRole"></span>
</div>
</div>
<div class="flex-container flexFlowColumn">
<div>
<span data-i18n="Created:">Created:</span>
<span class="userCreated"></span>
</div>
<div>
<span data-i18n="Password:">Password:</span>
<i class="hasPassword fa-fw fa-solid fa-lock" data-i18n="[title]This account is password protected." title="This account is password protected."></i>
<i class="noPassword fa-fw fa-solid fa-lock-open" data-i18n="[title]This account is not password protected." title="This account is not password protected."></i>
</div>
</div>
</div>
</div>
</div>
<div>
<h3 data-i18n="Account Actions">
Account Actions
</h3>
<div class="flex-container flexFlowColumn flexNoGap">
<div data-require-accounts class="flex-container">
<div class="userChangePasswordButton menu_button menu_button_icon" title="Change your password.">
<i class="fa-fw fa-solid fa-key"></i>
<span data-i18n="Change Password">Change Password</span>
</div>
</div>
<div class="flex-container">
<div class="userSettingsSnapshotsButton menu_button menu_button_icon" data-i18n="[title]Manage your settings snapshots." title="Manage your settings snapshots.">
<i class="fa-fw fa-solid fa-camera"></i>
<span data-i18n="Settings Snapshots">Settings Snapshots</span>
</div>
<div class="userBackupButton menu_button menu_button_icon" data-i18n="[title]Download a complete backup of your user data." title="Download a complete backup of your user data.">
<i class="fa-fw fa-solid fa-download"></i>
<span data-i18n="Download Backup">Download Backup</span>
</div>
</div>
</div>
</div>
<div>
<h3 data-i18n="Danger Zone">
Danger Zone
</h3>
<div class="flex-container">
<div class="userResetSettingsButton menu_button menu_button_icon" data-i18n="[title]Reset your settings to factory defaults." title="Reset your settings to factory defaults.">
<i class="fa-fw fa-solid fa-cog warning"></i>
<span data-i18n="Reset Settings">Reset Settings</span>
</div>
<div class="userResetAllButton menu_button menu_button_icon" data-i18n="[title]Wipe all user data and reset your account to factory settings." title="Wipe all user data and reset your account to factory settings.">
<i class="fa-fw fa-solid fa-skull warning"></i>
<span data-i18n="Reset Everything">Reset Everything</span>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,19 @@
<form action="javascript:void(0);" class="flex-container flexFlowColumn">
<h3 class="neutral_warning" data-i18n="This will delete all your settings and data. There will be no undo button. Make sure you have a backup before proceeding.">
This will delete all your settings and data. There will be no undo button.
Make sure you have a backup before proceeding.
</h3>
<hr>
<div data-i18n="Account reset code has been posted to the server console.">
Account reset code has been posted to the server console.
</div>
<br>
<div class="currentPasswordBlock">
<label data-i18n="Current Password:" for="user">Current Password:</label>
<input type="password" name="password" class="text_pole" placeholder="[ No password ]" autocomplete="current-password">
</div>
<div class="resetCodeBlock">
<label data-i18n="Reset Code:" for="password">Reset Code:</label>
<input type="text" name="code" class="text_pole" placeholder="XXXX">
</div>
</form>

View File

@@ -0,0 +1 @@
<div id="extensionsMenuButton" style="display: none;" class="fa-solid fa-magic-wand-sparkles interactable" title="Extensions" data-i18n="[title]Extensions"></div>

View File

@@ -0,0 +1,16 @@
<div id="extensionsMenu" class="options-content" style="display: none;">
<div id="data_bank_wand_container" class="extension_container"></div>
<div id="attach_file_wand_container" class="extension_container"></div>
<div id="sd_wand_container" class="extension_container"></div>
<div id="caption_wand_container" class="extension_container"></div>
<div id="tts_wand_container" class="extension_container"></div>
<div id="screen_share_wand_container" class="extension_container"></div>
<div id="prompt_inspector_wand_container" class="extension_container"></div>
<div id="emulatorjs_wand_container" class="extension_container"></div>
<div id="notebook_wand_container" class="extension_container"></div>
<div id="chess_wand_container" class="extension_container"></div>
<div id="token_counter_wand_container" class="extension_container"></div>
<div id="dice_wand_container" class="extension_container"></div>
<div id="objective_wand_container" class="extension_container"></div>
<div id="translate_wand_container" class="extension_container"></div>
</div>

View File

@@ -0,0 +1,89 @@
<h3>
<span id="version_display_welcome">{{displayVersion}}</span>
</h3>
<a href="https://docs.sillytavern.app/usage/update/" target="_blank" data-i18n="Want to update?">
Want to update?
</a>
<h3 data-i18n="How to start chatting?">How to start chatting?</h3>
<ol>
<li>
<span data-i18n="Click _space">Click </span>
<button class="menu_button menu_button_icon drawer-opener inline-flex" data-target="sys-settings-button">
<i class="fa-solid fa-plug"></i>
<span data-i18n="API Connections">API Connections</span>
</button>
<span data-i18n="and connect to an">and connect to an</span>
<a href="https://docs.sillytavern.app/usage/api-connections/" target="_blank">
<span class="fa-solid fa-circle-question"></span>
<span data-i18n="API">API</span></a>.
</li>
<li>
<span data-i18n="Click _space">Click </span>
<button class="menu_button menu_button_icon drawer-opener inline-flex" data-target="rightNavHolder">
<i class="fa-solid fa-address-card"></i>
<span data-i18n="Character Management">Character Management</span>
</button>
<span data-i18n="and pick a character."> and pick a character.</span>
</li>
</ol>
<div>
<span data-i18n="You can add more">You can add more</span>
<button class="open_characters_library menu_button menu_button_icon inline-flex">
<i class="fa-solid fa-image-portrait"></i>
<span data-i18n="Sample characters">Sample characters</span>
</button>
<span data-i18n="or;or_welcome">or</span>
<button class="external_import_button menu_button menu_button_icon inline-flex">
<i class="fa-solid fa-cloud-arrow-down"></i>
<span data-i18n="Import Characters">Import characters</span>
</button>
<span data-i18n="from other websites">from other websites.</span>
</div>
<div>
<span data-i18n="Go to the">Go to the</span>
<i data-i18n="Download Extensions & Assets">Download Extensions & Assets</i>
<span data-i18n="menu within">menu within</span>
<button class="menu_button menu_button_icon drawer-opener inline-flex" data-target="extensions-settings-button">
<i class="fa-solid fa-cubes"></i>
<span data-i18n="Extensions">Extensions</span>
</button>
<span data-i18n="to install additional features.">to install additional features.</span>
</div>
<h3 data-i18n="Confused or lost?">Confused or lost?</h3>
<ul>
<li>
<span class="note-link-span"><a class="fa-solid fa-circle-question" target="_blank" href="https://docs.sillytavern.app/"></a></span> - <span data-i18n="click these icons!">click these icons!</span>
</li>
<li>
<span data-i18n="Enter">Enter </span><code>/?</code><span data-i18n="in the chat bar"> in the chat bar</span>
</li>
<li>
<a target="_blank" href="https://docs.sillytavern.app/" data-i18n="SillyTavern Documentation Site">
SillyTavern Documentation Site
</a>
</li>
</ul>
<h3 data-i18n="Still have questions?">Still have questions?</h3>
<ul>
<li>
<a target="_blank" href="https://discord.gg/sillytavern" data-i18n="Join the SillyTavern Discord">
Join the SillyTavern Discord
</a>
</li>
<li>
<a target="_blank" href="https://github.com/SillyTavern/SillyTavern/issues" data-i18n="Post a GitHub issue">
Post a GitHub issue
</a>
</li>
<li>
<a target="_blank" href="https://github.com/SillyTavern/SillyTavern#questions-or-suggestions" data-i18n="Contact the developers">
Contact the developers
</a>
</li>
</ul>

View File

@@ -0,0 +1,90 @@
<div class="welcomePanel">
<div class="welcomeHeaderTitle">
<img src="img/logo.png" alt="SillyTavern Logo" class="welcomeHeaderLogo">
<span class="welcomeHeaderVersionDisplay">{{version}}</span>
<div class="mes_button showRecentChats" title="Show recent chats" data-i18n="[title]Show recent chats">
<i class="fa-solid fa-circle-chevron-down fa-fw fa-lg"></i>
</div>
<div class="mes_button hideRecentChats" title="Hide recent chats" data-i18n="[title]Hide recent chats">
<i class="fa-solid fa-circle-xmark fa-fw fa-lg"></i>
</div>
</div>
<div class="welcomeHeader">
<div class="recentChatsTitle" data-i18n="Recent Chats">
Recent Chats
</div>
<div class="welcomeShortcuts">
<a class="menu_button menu_button_icon" target="_blank" href="https://docs.sillytavern.app/">
<i class="fa-solid fa-question-circle"></i>
<span data-i18n="Docs">Docs</span>
</a>
<a class="menu_button menu_button_icon" target="_blank" href="https://github.com/SillyTavern/SillyTavern">
<i class="fa-brands fa-github"></i>
<span data-i18n="GitHub">GitHub</span>
</a>
<a class="menu_button menu_button_icon" target="_blank" href="https://discord.gg/sillytavern">
<i class="fa-brands fa-discord"></i>
<span data-i18n="Discord">Discord</span>
</a>
<span class="welcomeShortcutsSeparator">&vert;</span>
<button class="openTemporaryChat menu_button menu_button_icon">
<i class="fa-solid fa-comment-dots"></i>
<span data-i18n="Temporary Chat">Temporary Chat</span>
</button>
</div>
</div>
<div class="welcomeRecent">
<div class="recentChatList">
{{#if empty}}
<div class="noRecentChat">
<i class="fa-solid fa-comment-dots"></i>
<span data-i18n="No recent chats">No recent chats</span>
</div>
{{/if}}
{{#each chats}}
{{#with this}}
<div class="recentChat {{#if hidden}}hidden{{/if}} {{#if is_group}}group{{/if}}" data-file="{{chat_name}}" data-avatar="{{avatar}}" data-group="{{group}}">
<div class="avatar" title="[Character] {{char_name}}&#10;File: {{avatar}}">
<img src="{{char_thumbnail}}" alt="{{char_name}}">
</div>
<div class="recentChatInfo">
<div class="chatNameContainer">
<div class="chatName" title="{{file_name}}">
<strong class="characterName">{{char_name}}</strong>
<span>&ndash;</span>
<span>{{chat_name}}</span>
</div>
<small class="chatDate" title="{{date_long}}">{{date_short}}</small>
<div class="chatActions">
<button class="menu_button menu_button_icon renameChat" title="Rename chat" data-i18n="[title]Rename chat">
<i class="fa-solid fa-pen-to-square fa-fw"></i>
</button>
<button class="menu_button menu_button_icon deleteChat" title="Delete chat" data-i18n="[title]Delete chat">
<i class="fa-solid fa-trash fa-fw"></i>
</button>
</div>
</div>
<div class="chatMessageContainer">
<div class="chatMessage" title="{{mes}}">
{{mes}}
</div>
<div class="chatStats">
<div class="counterBlock">
<i class="fa-solid fa-comment fa-xs"></i>
<small>{{chat_items}}</small>
</div>
<small class="fileSize">{{file_size}}</small>
</div>
</div>
</div>
</div>
{{/with}}
{{/each}}
{{#if more}}
<button class="menu_button menu_button_icon showMoreChats">
<small class="fa-solid fa-chevron-down fa-fw fa-1x"></small>
</button>
{{/if}}
</div>
</div>
</div>

View File

@@ -0,0 +1,14 @@
<div class="flex-container">
<button class="menu_button menu_button_icon drawer-opener inline-flex" data-target="sys-settings-button">
<i class="fa-solid fa-plug"></i>
<span data-i18n="API Connections">API Connections</span>
</button>
<button class="menu_button menu_button_icon drawer-opener inline-flex" data-target="rightNavHolder">
<i class="fa-solid fa-address-card"></i>
<span data-i18n="Character Management">Character Management</span>
</button>
<button class="menu_button menu_button_icon drawer-opener inline-flex" data-target="extensions-settings-button">
<i class="fa-solid fa-cubes"></i>
<span data-i18n="Extensions">Extensions</span>
</button>
</div>

View File

@@ -0,0 +1,8 @@
<div id="WIEntryHeaderTitlesPC" class="flex-container wide100p spaceBetween justifyCenter textAlignCenter" style="padding:0 7.0em;">
<small class="flex1" data-i18n="Title/Memo">Title/Memo</small>
<small style="width: calc(3.5em + 10px)" data-i18n="Strategy">Strategy</small>
<small style="width: calc(3.5em + 20px)" data-i18n="Position">Position</small>
<small style="width: calc(3.5em + 15px)" data-i18n="Depth">Depth</small>
<small style="width: calc(3.5em + 20px)" data-i18n="Order">Order</small>
<small style="width: calc(3.5em + 15px)" data-i18n="Trigger %">Trigger %</small>
</div>