Merge branch 'staging' into stability

6608e530c599632a61305a51788ec5d55cf16c9f

Cohee <18619528+Cohee1207@users.noreply.github.com>

23 files changed, +81 -34Ignore whitespace
public/css/promptmanager.css+0 -1
@@ -233,7 +233,6 @@
233}233}
234234
235#completion_prompt_manager .completion_prompt_manager_footer a {235#completion_prompt_manager .completion_prompt_manager_footer a {
236 padding: 0.75em;
237 font-size: 12px;236 font-size: 12px;
238}237}
239238
public/css/rm-groups.css+1 -1
@@ -68,9 +68,9 @@
68 margin-top: 0.25rem;68 margin-top: 0.25rem;
69 margin-bottom: 0.5rem;69 margin-bottom: 0.5rem;
70 border: 1px solid var(--SmartThemeBorderColor);70 border: 1px solid var(--SmartThemeBorderColor);
71 ;
72 border-radius: 10px;71 border-radius: 10px;
73 background-color: var(--black30a);72 background-color: var(--black30a);
73 padding: 2px;
74}74}
7575
76#rm_group_buttons_expander {76#rm_group_buttons_expander {
public/index.html+7 -2
@@ -4141,6 +4141,10 @@
4141 <input id="request_token_probabilities" type="checkbox" />4141 <input id="request_token_probabilities" type="checkbox" />
4142 <small data-i18n="Request token probabilities">Request token probabilities</small>4142 <small data-i18n="Request token probabilities">Request token probabilities</small>
4143 </label>4143 </label>
4144 <label data-newbie-hidden class="checkbox_label" for="show_group_chat_queue" title="In group chat, highlight the character(s) that are currently queued to generate responses and the order in which they will respond." data-i18n="[title]In group chat, highlight the character(s) that are currently queued to generate responses and the order in which they will respond.">
4145 <input id="show_group_chat_queue" type="checkbox" />
4146 <small data-i18n="Show group chat queue">Show group chat queue</small>
4147 </label>
4144 <div data-newbie-hidden class="inline-drawer wide100p flexFlowColumn">4148 <div data-newbie-hidden class="inline-drawer wide100p flexFlowColumn">
4145 <div class="inline-drawer-toggle inline-drawer-header userSettingsInnerExpandable" title="Automatically reject and re-generate AI message based on configurable criteria." data-i18n="[title]Automatically reject and re-generate AI message based on configurable criteria">4149 <div class="inline-drawer-toggle inline-drawer-header userSettingsInnerExpandable" title="Automatically reject and re-generate AI message based on configurable criteria." data-i18n="[title]Automatically reject and re-generate AI message based on configurable criteria">
4146 <b><span data-i18n="Auto-swipe">Auto-swipe</span></b>4150 <b><span data-i18n="Auto-swipe">Auto-swipe</span></b>
@@ -5596,10 +5600,10 @@
5596 <label for="completion_prompt_manager_popup_entry_form_injection_position">5600 <label for="completion_prompt_manager_popup_entry_form_injection_position">
5597 <span data-i18n="prompt_manager_position">Position</span>5601 <span data-i18n="prompt_manager_position">Position</span>
5598 </label>5602 </label>
5599 <div class="text_muted" data-i18n="Injection position. Next to other prompts (relative) or in-chat (absolute).">Injection position. Next to other prompts (relative) or in-chat (absolute).</div>5603 <div class="text_muted" data-i18n="Injection position. Relative (to other prompts in prompt manager) or In-chat @ Depth.">Injection position. Relative (to other prompts in prompt manager) or In-chat @ Depth.</div>
5600 <select id="completion_prompt_manager_popup_entry_form_injection_position" class="text_pole" name="injection_position">5604 <select id="completion_prompt_manager_popup_entry_form_injection_position" class="text_pole" name="injection_position">
5601 <option data-i18n="prompt_manager_relative" value="0">Relative</option>5605 <option data-i18n="prompt_manager_relative" value="0">Relative</option>
5602 <option data-i18n="prompt_manager_absolute" value="1">Absolute</option>5606 <option data-i18n="prompt_manager_in_chat" value="1">In-chat</option>
5603 </select>5607 </select>
5604 </div>5608 </div>
5605 <div id="completion_prompt_manager_depth_block" class="completion_prompt_manager_popup_entry_form_control flex1">5609 <div id="completion_prompt_manager_depth_block" class="completion_prompt_manager_popup_entry_form_control flex1">
@@ -5796,6 +5800,7 @@
5796 <div class="tags tags_inline"></div>5800 <div class="tags tags_inline"></div>
5797 </div>5801 </div>
5798 <input class="ch_fav" value="" hidden />5802 <input class="ch_fav" value="" hidden />
5803 <div class="queue_position"></div>
5799 <div class="group_member_icon">5804 <div class="group_member_icon">
5800 <div title="Temporarily disable automatic replies from this character" data-action="disable" class="right_menu_button fa-solid fa-lg fa-comment-slash" data-i18n="[title]Temporarily disable automatic replies from this character"></div>5805 <div title="Temporarily disable automatic replies from this character" data-action="disable" class="right_menu_button fa-solid fa-lg fa-comment-slash" data-i18n="[title]Temporarily disable automatic replies from this character"></div>
5801 <div title="Enable automatic replies from this character" data-action="enable" class="right_menu_button fa-solid fa-lg fa-comment-slash" data-i18n="[title]Enable automatic replies from this character"></div>5806 <div title="Enable automatic replies from this character" data-action="enable" class="right_menu_button fa-solid fa-lg fa-comment-slash" data-i18n="[title]Enable automatic replies from this character"></div>
public/locales/ar-sa.json+0 -1
@@ -1023,7 +1023,6 @@
1023 "prompt_manager_position": "موضع",1023 "prompt_manager_position": "موضع",
1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "موضع الحقن. بجوار المطالبات الأخرى (نسبية) أو داخل الدردشة (مطلقة).",1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "موضع الحقن. بجوار المطالبات الأخرى (نسبية) أو داخل الدردشة (مطلقة).",
1025 "prompt_manager_relative": "نسبي",1025 "prompt_manager_relative": "نسبي",
1026 "prompt_manager_absolute": "مطلق",
1027 "prompt_manager_depth": "عمق",1026 "prompt_manager_depth": "عمق",
1028 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "عمق الحقن. 0 = بعد الرسالة الأخيرة، 1 = قبل الرسالة الأخيرة، الخ.",1027 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "عمق الحقن. 0 = بعد الرسالة الأخيرة، 1 = قبل الرسالة الأخيرة، الخ.",
1029 "Prompt": "موضوع",1028 "Prompt": "موضوع",
public/locales/de-de.json+0 -1
@@ -1023,7 +1023,6 @@
1023 "prompt_manager_position": "Position",1023 "prompt_manager_position": "Position",
1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Injektionsposition. Neben anderen Eingabeaufforderungen (relativ) oder im Chat (absolut).",1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Injektionsposition. Neben anderen Eingabeaufforderungen (relativ) oder im Chat (absolut).",
1025 "prompt_manager_relative": "Relativ",1025 "prompt_manager_relative": "Relativ",
1026 "prompt_manager_absolute": "Absolut",
1027 "prompt_manager_depth": "Tiefe",1026 "prompt_manager_depth": "Tiefe",
1028 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Injektionstiefe. 0 = nach der letzten Nachricht, 1 = vor der letzten Nachricht usw.",1027 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Injektionstiefe. 0 = nach der letzten Nachricht, 1 = vor der letzten Nachricht usw.",
1029 "Prompt": "Aufforderung",1028 "Prompt": "Aufforderung",
public/locales/es-es.json+0 -1
@@ -1023,7 +1023,6 @@
1023 "prompt_manager_position": "Posición",1023 "prompt_manager_position": "Posición",
1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Posición de inyección. Junto a otras indicaciones (relativa) o en el chat (absoluta).",1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Posición de inyección. Junto a otras indicaciones (relativa) o en el chat (absoluta).",
1025 "prompt_manager_relative": "Relativo",1025 "prompt_manager_relative": "Relativo",
1026 "prompt_manager_absolute": "Absoluto",
1027 "prompt_manager_depth": "Profundidad",1026 "prompt_manager_depth": "Profundidad",
1028 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Profundidad de inyección. 0 = después del último mensaje, 1 = antes del último mensaje, etc.",1027 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Profundidad de inyección. 0 = después del último mensaje, 1 = antes del último mensaje, etc.",
1029 "Prompt": "Indicar",1028 "Prompt": "Indicar",
public/locales/fr-fr.json+0 -1
@@ -1023,7 +1023,6 @@
1023 "prompt_manager_position": "Position",1023 "prompt_manager_position": "Position",
1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Position d'injection. À côté d’autres invites (relatives) ou dans le chat (absolues).",1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Position d'injection. À côté d’autres invites (relatives) ou dans le chat (absolues).",
1025 "prompt_manager_relative": "Relatif",1025 "prompt_manager_relative": "Relatif",
1026 "prompt_manager_absolute": "Absolu",
1027 "prompt_manager_depth": "Profondeur",1026 "prompt_manager_depth": "Profondeur",
1028 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Profondeur d'injection. 0 = après le dernier message, 1 = avant le dernier message, etc.",1027 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Profondeur d'injection. 0 = après le dernier message, 1 = avant le dernier message, etc.",
1029 "Prompt": "Inciter",1028 "Prompt": "Inciter",
public/locales/is-is.json+0 -1
@@ -1023,7 +1023,6 @@
1023 "prompt_manager_position": "Staða",1023 "prompt_manager_position": "Staða",
1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Inndælingarstaða. Við hliðina á öðrum leiðbeiningum (afstætt) eða í spjalli (algert).",1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Inndælingarstaða. Við hliðina á öðrum leiðbeiningum (afstætt) eða í spjalli (algert).",
1025 "prompt_manager_relative": "Aðstandandi",1025 "prompt_manager_relative": "Aðstandandi",
1026 "prompt_manager_absolute": "Algjört",
1027 "prompt_manager_depth": "Dýpt",1026 "prompt_manager_depth": "Dýpt",
1028 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Inndælingardýpt. 0 = eftir síðustu skilaboð, 1 = fyrir síðustu skilaboð o.s.frv.",1027 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Inndælingardýpt. 0 = eftir síðustu skilaboð, 1 = fyrir síðustu skilaboð o.s.frv.",
1029 "Prompt": "Ábending",1028 "Prompt": "Ábending",
public/locales/it-it.json+0 -1
@@ -1023,7 +1023,6 @@
1023 "prompt_manager_position": "Posizione",1023 "prompt_manager_position": "Posizione",
1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Posizione di iniezione. Accanto ad altri suggerimenti (relativo) o in chat (assoluto).",1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Posizione di iniezione. Accanto ad altri suggerimenti (relativo) o in chat (assoluto).",
1025 "prompt_manager_relative": "Parente",1025 "prompt_manager_relative": "Parente",
1026 "prompt_manager_absolute": "Assoluto",
1027 "prompt_manager_depth": "Profondità",1026 "prompt_manager_depth": "Profondità",
1028 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Profondità di iniezione. 0 = dopo l'ultimo messaggio, 1 = prima dell'ultimo messaggio, ecc.",1027 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Profondità di iniezione. 0 = dopo l'ultimo messaggio, 1 = prima dell'ultimo messaggio, ecc.",
1029 "Prompt": "Prompt",1028 "Prompt": "Prompt",
public/locales/ja-jp.json+0 -1
@@ -1023,7 +1023,6 @@
1023 "prompt_manager_position": "位置",1023 "prompt_manager_position": "位置",
1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "挿入位置。他のプロンプトの隣 (相対) またはチャット内 (絶対)。",1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "挿入位置。他のプロンプトの隣 (相対) またはチャット内 (絶対)。",
1025 "prompt_manager_relative": "相対的",1025 "prompt_manager_relative": "相対的",
1026 "prompt_manager_absolute": "絶対",
1027 "prompt_manager_depth": "深さ",1026 "prompt_manager_depth": "深さ",
1028 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "注入の深さ。0 = 最後のメッセージの後、1 = 最後のメッセージの前など。",1027 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "注入の深さ。0 = 最後のメッセージの後、1 = 最後のメッセージの前など。",
1029 "Prompt": "プロンプト",1028 "Prompt": "プロンプト",
public/locales/ko-kr.json+0 -1
@@ -1023,7 +1023,6 @@
1023 "prompt_manager_position": "위치",1023 "prompt_manager_position": "위치",
1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "주입 위치. 다른 프롬프트 옆(상대적) 또는 채팅 내(절대적).",1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "주입 위치. 다른 프롬프트 옆(상대적) 또는 채팅 내(절대적).",
1025 "prompt_manager_relative": "상대적인",1025 "prompt_manager_relative": "상대적인",
1026 "prompt_manager_absolute": "순수한",
1027 "prompt_manager_depth": "깊이",1026 "prompt_manager_depth": "깊이",
1028 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "주입 깊이. 0 = 마지막 메시지 뒤, 1 = 마지막 메시지 앞 등",1027 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "주입 깊이. 0 = 마지막 메시지 뒤, 1 = 마지막 메시지 앞 등",
1029 "Prompt": "프롬프트",1028 "Prompt": "프롬프트",
public/locales/nl-nl.json+0 -1
@@ -1023,7 +1023,6 @@
1023 "prompt_manager_position": "Positie",1023 "prompt_manager_position": "Positie",
1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Injectiepositie. Naast andere prompts (relatief) of in-chat (absoluut).",1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Injectiepositie. Naast andere prompts (relatief) of in-chat (absoluut).",
1025 "prompt_manager_relative": "Familielid",1025 "prompt_manager_relative": "Familielid",
1026 "prompt_manager_absolute": "Absoluut",
1027 "prompt_manager_depth": "Diepte",1026 "prompt_manager_depth": "Diepte",
1028 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Injectiediepte. 0 = na het laatste bericht, 1 = voor het laatste bericht, etc.",1027 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Injectiediepte. 0 = na het laatste bericht, 1 = voor het laatste bericht, etc.",
1029 "Prompt": "Prompt",1028 "Prompt": "Prompt",
public/locales/pt-pt.json+0 -1
@@ -1023,7 +1023,6 @@
1023 "prompt_manager_position": "Posição",1023 "prompt_manager_position": "Posição",
1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Posição de injeção. Ao lado de outras solicitações (relativas) ou no chat (absolutas).",1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Posição de injeção. Ao lado de outras solicitações (relativas) ou no chat (absolutas).",
1025 "prompt_manager_relative": "Relativo",1025 "prompt_manager_relative": "Relativo",
1026 "prompt_manager_absolute": "Absoluto",
1027 "prompt_manager_depth": "Profundidade",1026 "prompt_manager_depth": "Profundidade",
1028 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Profundidade de injeção. 0 = após a última mensagem, 1 = antes da última mensagem, etc.",1027 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Profundidade de injeção. 0 = após a última mensagem, 1 = antes da última mensagem, etc.",
1029 "Prompt": "Prompt",1028 "Prompt": "Prompt",
public/locales/ru-ru.json+0 -1
@@ -1025,7 +1025,6 @@
1025 "prompt_manager_position": "Точка инжекта",1025 "prompt_manager_position": "Точка инжекта",
1026 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Как рассчитывать позицию для инжекта. Она может располагаться по отношению к другим промптам (относительная) либо по отношению к чату (абсолютная).",1026 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Как рассчитывать позицию для инжекта. Она может располагаться по отношению к другим промптам (относительная) либо по отношению к чату (абсолютная).",
1027 "prompt_manager_relative": "Относительная",1027 "prompt_manager_relative": "Относительная",
1028 "prompt_manager_absolute": "Абсолютная",
1029 "prompt_manager_depth": "Глубина",1028 "prompt_manager_depth": "Глубина",
1030 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Глубина вставки. 0 = после последнего сообщения, 1 = перед последним сообщением, и т.д.",1029 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Глубина вставки. 0 = после последнего сообщения, 1 = перед последним сообщением, и т.д.",
1031 "The prompt to be sent.": "Отправляемый ИИ промпт.",1030 "The prompt to be sent.": "Отправляемый ИИ промпт.",
public/locales/uk-ua.json+0 -1
@@ -1023,7 +1023,6 @@
1023 "prompt_manager_position": "Позиція",1023 "prompt_manager_position": "Позиція",
1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Позиція ін'єкції. Поруч з іншими підказками (відносні) або в чаті (абсолютні).",1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Позиція ін'єкції. Поруч з іншими підказками (відносні) або в чаті (абсолютні).",
1025 "prompt_manager_relative": "Відносна",1025 "prompt_manager_relative": "Відносна",
1026 "prompt_manager_absolute": "Абсолютний",
1027 "prompt_manager_depth": "Глибина",1026 "prompt_manager_depth": "Глибина",
1028 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Глибина ін'єкції. 0 = після останнього повідомлення, 1 = перед останнім повідомленням тощо.",1027 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Глибина ін'єкції. 0 = після останнього повідомлення, 1 = перед останнім повідомленням тощо.",
1029 "Prompt": "Запит",1028 "Prompt": "Запит",
public/locales/vi-vn.json+0 -1
@@ -1023,7 +1023,6 @@
1023 "prompt_manager_position": "Chức vụ",1023 "prompt_manager_position": "Chức vụ",
1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Vị trí tiêm. Bên cạnh các lời nhắc khác (tương đối) hoặc trong trò chuyện (tuyệt đối).",1024 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Vị trí tiêm. Bên cạnh các lời nhắc khác (tương đối) hoặc trong trò chuyện (tuyệt đối).",
1025 "prompt_manager_relative": "Liên quan đến",1025 "prompt_manager_relative": "Liên quan đến",
1026 "prompt_manager_absolute": "tuyệt đối",
1027 "prompt_manager_depth": "Chiều sâu",1026 "prompt_manager_depth": "Chiều sâu",
1028 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Độ sâu phun. 0 = sau tin nhắn cuối cùng, 1 = trước tin nhắn cuối cùng, v.v.",1027 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Độ sâu phun. 0 = sau tin nhắn cuối cùng, 1 = trước tin nhắn cuối cùng, v.v.",
1029 "Prompt": "Đề xuất",1028 "Prompt": "Đề xuất",
public/locales/zh-cn.json+0 -1
@@ -1056,7 +1056,6 @@
1056 "prompt_manager_position": "位置",1056 "prompt_manager_position": "位置",
1057 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "注入位置。其他提示词旁边(相对)或在聊天中(绝对)。",1057 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "注入位置。其他提示词旁边(相对)或在聊天中(绝对)。",
1058 "prompt_manager_relative": "相对",1058 "prompt_manager_relative": "相对",
1059 "prompt_manager_absolute": "绝对",
1060 "prompt_manager_depth": "深度",1059 "prompt_manager_depth": "深度",
1061 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "注入深度。0 = 在最后一条消息之后,1 = 在最后一条消息之前,等等。",1060 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "注入深度。0 = 在最后一条消息之后,1 = 在最后一条消息之前,等等。",
1062 "Prompt": "提示词",1061 "Prompt": "提示词",
public/locales/zh-tw.json+0 -1
@@ -1025,7 +1025,6 @@
1025 "prompt_manager_position": "位置",1025 "prompt_manager_position": "位置",
1026 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "注入位置。與其他提示詞相鄰(相對位置)或在聊天中(絕對位置)。",1026 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "注入位置。與其他提示詞相鄰(相對位置)或在聊天中(絕對位置)。",
1027 "prompt_manager_relative": "相對位置",1027 "prompt_manager_relative": "相對位置",
1028 "prompt_manager_absolute": "絕對位置",
1029 "prompt_manager_depth": "深度",1028 "prompt_manager_depth": "深度",
1030 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "注入深度。0 = 在最後一條訊息之後,1 = 在最後一條訊息之前,以此類推。",1029 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "注入深度。0 = 在最後一條訊息之後,1 = 在最後一條訊息之前,以此類推。",
1031 "Prompt": "提示詞",1030 "Prompt": "提示詞",
public/scripts/group-chats.js+42 -8
@@ -70,6 +70,7 @@ import {
70 animation_duration,70 animation_duration,
71 depth_prompt_role_default,71 depth_prompt_role_default,
72 shouldAutoContinue,72 shouldAutoContinue,
73 this_chid,
73} from '../script.js';74} from '../script.js';
74import { printTagList, createTagMapFromList, applyTagsOnCharacterSelect, tag_map, applyTagsOnGroupSelect } from './tags.js';75import { printTagList, createTagMapFromList, applyTagsOnCharacterSelect, tag_map, applyTagsOnGroupSelect } from './tags.js';
75import { FILTER_TYPES, FilterHelper } from './filters.js';76import { FILTER_TYPES, FilterHelper } from './filters.js';
@@ -120,6 +121,8 @@ const DEFAULT_AUTO_MODE_DELAY = 5;
120export const groupCandidatesFilter = new FilterHelper(debounce(printGroupCandidates, debounce_timeout.quick));121export const groupCandidatesFilter = new FilterHelper(debounce(printGroupCandidates, debounce_timeout.quick));
121let autoModeWorker = null;122let autoModeWorker = null;
122const saveGroupDebounced = debounce(async (group, reload) => await _save(group, reload), debounce_timeout.relaxed);123const saveGroupDebounced = debounce(async (group, reload) => await _save(group, reload), debounce_timeout.relaxed);
124/** @type {Map<string, number>} */
125let groupChatQueueOrder = new Map();
123126
124function setAutoModeWorker() {127function setAutoModeWorker() {
125 clearInterval(autoModeWorker);128 clearInterval(autoModeWorker);
@@ -855,9 +858,15 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) {
855 const bias = getBiasStrings(userInput, type);858 const bias = getBiasStrings(userInput, type);
856 await sendMessageAsUser(userInput, bias.messageBias);859 await sendMessageAsUser(userInput, bias.messageBias);
857 await saveChatConditional();860 await saveChatConditional();
858 $('#send_textarea').val('')[0].dispatchEvent(new Event('input', { bubbles:true }));861 $('#send_textarea').val('')[0].dispatchEvent(new Event('input', { bubbles: true }));
859 }862 }
863 groupChatQueueOrder = new Map();
860864
865 if (power_user.show_group_chat_queue) {
866 for (let i = 0; i < activatedMembers.length; ++i) {
867 groupChatQueueOrder.set(characters[activatedMembers[i]].avatar, i + 1);
868 }
869 }
861 // now the real generation begins: cycle through every activated character870 // now the real generation begins: cycle through every activated character
862 for (const chId of activatedMembers) {871 for (const chId of activatedMembers) {
863 throwIfAborted();872 throwIfAborted();
@@ -865,6 +874,9 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) {
865 const generateType = type == 'swipe' || type == 'impersonate' || type == 'quiet' || type == 'continue' ? type : 'group_chat';874 const generateType = type == 'swipe' || type == 'impersonate' || type == 'quiet' || type == 'continue' ? type : 'group_chat';
866 setCharacterId(chId);875 setCharacterId(chId);
867 setCharacterName(characters[chId].name);876 setCharacterName(characters[chId].name);
877 if (power_user.show_group_chat_queue) {
878 printGroupMembers();
879 }
868 await eventSource.emit(event_types.GROUP_MEMBER_DRAFTED, chId);880 await eventSource.emit(event_types.GROUP_MEMBER_DRAFTED, chId);
869881
870 if (type !== 'swipe' && type !== 'impersonate' && !isStreamingEnabled()) {882 if (type !== 'swipe' && type !== 'impersonate' && !isStreamingEnabled()) {
@@ -885,6 +897,10 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) {
885 messageChunk = textResult?.messageChunk;897 messageChunk = textResult?.messageChunk;
886 }898 }
887 }899 }
900 if (power_user.show_group_chat_queue) {
901 groupChatQueueOrder.delete(characters[chId].avatar);
902 groupChatQueueOrder.forEach((value, key, map) => map.set(key, value - 1));
903 }
888 }904 }
889 } finally {905 } finally {
890 typingIndicator.hide();906 typingIndicator.hide();
@@ -892,6 +908,10 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) {
892 is_group_generating = false;908 is_group_generating = false;
893 setSendButtonState(false);909 setSendButtonState(false);
894 setCharacterId(undefined);910 setCharacterId(undefined);
911 if (power_user.show_group_chat_queue) {
912 groupChatQueueOrder = new Map();
913 printGroupMembers();
914 }
895 setCharacterName('');915 setCharacterName('');
896 activateSendButtons();916 activateSendButtons();
897 showSwipeButtons();917 showSwipeButtons();
@@ -1006,6 +1026,7 @@ function activateNaturalOrder(members, input, lastMessage, allowSelfResponses, i
1006 }1026 }
1007 }1027 }
10081028
1029 const chattyMembers = [];
1009 // activation by talkativeness (in shuffled order, except banned)1030 // activation by talkativeness (in shuffled order, except banned)
1010 const shuffledMembers = shuffle([...members]);1031 const shuffledMembers = shuffle([...members]);
1011 for (let member of shuffledMembers) {1032 for (let member of shuffledMembers) {
@@ -1016,26 +1037,30 @@ function activateNaturalOrder(members, input, lastMessage, allowSelfResponses, i
1016 }1037 }
10171038
1018 const rollValue = Math.random();1039 const rollValue = Math.random();
1019 let talkativeness = Number(character.talkativeness);1040 const talkativeness = isNaN(character.talkativeness)
1020 talkativeness = Number.isNaN(talkativeness)
1021 ? talkativeness_default1041 ? talkativeness_default
1022 : talkativeness;1042 : Number(character.talkativeness);
1023 if (talkativeness >= rollValue) {1043 if (talkativeness >= rollValue) {
1024 activatedMembers.push(member);1044 activatedMembers.push(member);
1025 }1045 }
1046 if (talkativeness > 0) {
1047 chattyMembers.push(member);
1048 }
1026 }1049 }
10271050
1028 // pick 1 at random if no one was activated1051 // pick 1 at random if no one was activated
1029 let retries = 0;1052 let retries = 0;
1030 while (activatedMembers.length === 0 && ++retries <= members.length) {1053 // try to limit the selected random character to those with talkativeness > 0
1031 const randomIndex = Math.floor(Math.random() * members.length);1054 const randomPool = chattyMembers.length > 0 ? chattyMembers : members;
1032 const character = characters.find((x) => x.avatar === members[randomIndex]);1055 while (activatedMembers.length === 0 && ++retries <= randomPool.length) {
1056 const randomIndex = Math.floor(Math.random() * randomPool.length);
1057 const character = characters.find((x) => x.avatar === randomPool[randomIndex]);
10331058
1034 if (!character) {1059 if (!character) {
1035 continue;1060 continue;
1036 }1061 }
10371062
1038 activatedMembers.push(members[randomIndex]);1063 activatedMembers.push(randomPool[randomIndex]);
1039 }1064 }
10401065
1041 // de-duplicate array of character avatars1066 // de-duplicate array of character avatars
@@ -1313,6 +1338,14 @@ function getGroupCharacterBlock(character) {
1313 template.attr('chid', characters.indexOf(character));1338 template.attr('chid', characters.indexOf(character));
1314 template.find('.ch_fav').val(isFav);1339 template.find('.ch_fav').val(isFav);
1315 template.toggleClass('is_fav', isFav);1340 template.toggleClass('is_fav', isFav);
1341
1342 let queuePosition = groupChatQueueOrder.get(character.avatar);
1343 if (queuePosition) {
1344 template.find('.queue_position').text(queuePosition);
1345 template.toggleClass('is_queued', queuePosition > 1);
1346 template.toggleClass('is_active', queuePosition === 1);
1347 }
1348
1316 template.toggleClass('disabled', isGroupMemberDisabled(character.avatar));1349 template.toggleClass('disabled', isGroupMemberDisabled(character.avatar));
13171350
1318 // Display inline tags1351 // Display inline tags
@@ -1605,6 +1638,7 @@ export async function openGroupById(groupId) {
1605 select_group_chats(groupId);1638 select_group_chats(groupId);
16061639
1607 if (selected_group !== groupId) {1640 if (selected_group !== groupId) {
1641 groupChatQueueOrder = new Map();
1608 await clearChat();1642 await clearChat();
1609 cancelTtsPlay();1643 cancelTtsPlay();
1610 selected_group = groupId;1644 selected_group = groupId;
public/scripts/macros.js+1 -1
@@ -437,7 +437,7 @@ export function evaluateMacros(content, env) {
437 content = replaceInstructMacros(content, env);437 content = replaceInstructMacros(content, env);
438 content = replaceVariableMacros(content);438 content = replaceVariableMacros(content);
439 content = content.replace(/{{newline}}/gi, '\n');439 content = content.replace(/{{newline}}/gi, '\n');
440 content = content.replace(/\n*{{trim}}\n*/gi, '');440 content = content.replace(/(?:\r?\n)*{{trim}}(?:\r?\n)*/gi, '');
441 content = content.replace(/{{noop}}/gi, '');441 content = content.replace(/{{noop}}/gi, '');
442 content = content.replace(/{{input}}/gi, () => String($('#send_textarea').val()));442 content = content.replace(/{{input}}/gi, () => String($('#send_textarea').val()));
443443
public/scripts/power-user.js+7 -0
@@ -179,6 +179,7 @@ let power_user = {
179 send_on_enter: send_on_enter_options.AUTO,179 send_on_enter: send_on_enter_options.AUTO,
180 console_log_prompts: false,180 console_log_prompts: false,
181 request_token_probabilities: false,181 request_token_probabilities: false,
182 show_group_chat_queue: false,
182 render_formulas: false,183 render_formulas: false,
183 allow_name1_display: false,184 allow_name1_display: false,
184 allow_name2_display: false,185 allow_name2_display: false,
@@ -1601,6 +1602,7 @@ function loadPowerUserSettings(settings, data) {
16011602
1602 $('#console_log_prompts').prop('checked', power_user.console_log_prompts);1603 $('#console_log_prompts').prop('checked', power_user.console_log_prompts);
1603 $('#request_token_probabilities').prop('checked', power_user.request_token_probabilities);1604 $('#request_token_probabilities').prop('checked', power_user.request_token_probabilities);
1605 $('#show_group_chat_queue').prop('checked', power_user.show_group_chat_queue);
1604 $('#auto_fix_generated_markdown').prop('checked', power_user.auto_fix_generated_markdown);1606 $('#auto_fix_generated_markdown').prop('checked', power_user.auto_fix_generated_markdown);
1605 $('#auto_scroll_chat_to_bottom').prop('checked', power_user.auto_scroll_chat_to_bottom);1607 $('#auto_scroll_chat_to_bottom').prop('checked', power_user.auto_scroll_chat_to_bottom);
1606 $('#bogus_folders').prop('checked', power_user.bogus_folders);1608 $('#bogus_folders').prop('checked', power_user.bogus_folders);
@@ -3567,6 +3569,11 @@ $(document).ready(() => {
3567 saveSettingsDebounced();3569 saveSettingsDebounced();
3568 });3570 });
35693571
3572 $('#show_group_chat_queue').on('input', function () {
3573 power_user.show_group_chat_queue = !!$(this).prop('checked');
3574 saveSettingsDebounced();
3575 });
3576
3570 $('#auto_scroll_chat_to_bottom').on('input', function () {3577 $('#auto_scroll_chat_to_bottom').on('input', function () {
3571 power_user.auto_scroll_chat_to_bottom = !!$(this).prop('checked');3578 power_user.auto_scroll_chat_to_bottom = !!$(this).prop('checked');
3572 saveSettingsDebounced();3579 saveSettingsDebounced();
public/scripts/templates/promptManagerFooter.html+6 -6
@@ -2,10 +2,10 @@
2 <select id="{{prefix}}prompt_manager_footer_append_prompt" class="text_pole" name="append-prompt">2 <select id="{{prefix}}prompt_manager_footer_append_prompt" class="text_pole" name="append-prompt">
3 {{{promptsHtml}}}3 {{{promptsHtml}}}
4 </select>4 </select>
5 <a class="menu_button fa-chain fa-solid" title="Insert prompt" data-i18n="[title]Insert prompt"></a>5 <a class="menu_button fa-chain fa-solid fa-fw" title="Insert prompt" data-i18n="[title]Insert prompt"></a>
6 <a class="caution menu_button fa-x fa-solid" title="Delete prompt" data-i18n="[title]Delete prompt"></a>6 <a class="caution menu_button fa-x fa-solid fa-fw" title="Delete prompt" data-i18n="[title]Delete prompt"></a>
7 <a class="menu_button fa-file-import fa-solid" id="prompt-manager-import" title="Import a prompt list" data-i18n="[title]Import a prompt list"></a>7 <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>
8 <a class="menu_button fa-file-export fa-solid" id="prompt-manager-export" title="Export this prompt list" data-i18n="[title]Export this prompt list"></a>8 <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>
9 <a class="menu_button fa-undo fa-solid" id="prompt-manager-reset-character" title="Reset current character" data-i18n="[title]Reset current character"></a>9 <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>
10 <a class="menu_button fa-plus-square fa-solid" title="New prompt" data-i18n="[title]New prompt"></a>10 <a class="menu_button fa-plus-square fa-solid fa-fw" title="New prompt" data-i18n="[title]New prompt"></a>
11</div>11</div>
public/style.css+17 -0
@@ -2922,6 +2922,23 @@ input[type=search]:focus::-webkit-search-cancel-button {
2922 position: relative;2922 position: relative;
2923}2923}
29242924
2925.group_member .queue_position:not(:empty)::before {
2926 content: "#";
2927}
2928
2929.group_member .queue_position {
2930 margin-right: 0.75rem;
2931 font-size: calc(var(--mainFontSize) * 0.9);
2932}
2933
2934.group_member.is_queued {
2935 outline: 2px solid var(--golden);
2936}
2937
2938.group_member.is_active {
2939 outline: 2px solid var(--active);
2940}
2941
2925.character_select.is_fav .avatar,2942.character_select.is_fav .avatar,
2926.group_select.is_fav .avatar,2943.group_select.is_fav .avatar,
2927.group_member.is_fav .avatar,2944.group_member.is_fav .avatar,