import { extensionName } from "../../utils/settings.js";
import { AgentManager } from "./agent-manager.js";
import { characters, this_chid, saveSettingsDebounced } from "/script.js";
import { world_names } from "/scripts/world-info.js";
import { getApiConfig, setApiConfig, testConnection, fetchModels } from "./api.js";
import { tools } from "./tools.js";
const extensionFolderPath = `scripts/extensions/third-party/${extensionName}`;
let isInitialized = false;
let agentManager = null;
let previousCharData = {};
let previousWorldData = {};
export async function openAutoCharCardWindow() {
toastr.info("该功能正在开发,尚未完成,请耐心等待。");
return;
if ($('#acc-window').length > 0) {
$('#acc-window').show();
return;
}
if (!$('#acc-style').length) {
$('')
.attr('id', 'acc-style')
.attr('rel', 'stylesheet')
.attr('type', 'text/css')
.attr('href', `${extensionFolderPath}/assets/auto-char-card/style.css`)
.appendTo('head');
}
try {
const htmlContent = await $.get(`${extensionFolderPath}/assets/auto-char-card/index.html`);
$('body').append(htmlContent);
bindEvents();
agentManager = new AgentManager();
try {
populateDropdowns();
loadApiSettings();
} catch (dataError) {
console.error('[Amily2 AutoCharCard] Failed to load data:', dataError);
toastr.warning('数据加载部分失败,请检查控制台。');
}
isInitialized = true;
console.log('[Amily2 AutoCharCard] Window initialized.');
} catch (error) {
console.error('[Amily2 AutoCharCard] Failed to initialize window:', error);
toastr.error(`无法加载自动构建器界面: ${error.message}`);
$('#acc-window').remove();
}
}
function populateDropdowns() {
const charSelect = $('#acc-target-char');
charSelect.empty().append('');
charSelect.append('');
characters.forEach((char, index) => {
if (char) {
const option = $('');
worldSelect.append('');
world_names.forEach(name => {
worldSelect.append($('');
try {
const models = await fetchModels(apiUrl, apiKey);
select.empty().append('');
if (models.length === 0) {
select.append('');
} else {
models.forEach(model => {
select.append(new Option(model, model));
});
toastr.success(`成功获取 ${models.length} 个模型`);
}
} catch (error) {
console.error(`[AutoCharCard] Failed to fetch models for ${role}:`, error);
toastr.error(`获取模型失败: ${error.message}`);
select.empty().append('');
} finally {
btn.prop('disabled', false).html(originalIcon);
}
};
$('#acc-executor-refresh-models').on('click', () => handleRefreshModels('executor'));
$('#acc-reviewer-refresh-models').on('click', () => handleRefreshModels('reviewer'));
$('#acc-executor-test').on('click', async function() {
const btn = $(this);
btn.prop('disabled', true).text('测试中...');
const success = await testConnection('executor');
btn.prop('disabled', false).text('测试连接');
if (success) toastr.success('模型 A 连接成功');
else toastr.error('模型 A 连接失败');
});
$('#acc-reviewer-test').on('click', async function() {
const btn = $(this);
btn.prop('disabled', true).text('测试中...');
const success = await testConnection('reviewer');
btn.prop('disabled', false).text('测试连接');
if (success) toastr.success('模型 B 连接成功');
else toastr.error('模型 B 连接失败');
});
}
async function handleSendMessage() {
const input = $('#acc-user-input');
const message = input.val().trim();
if (!message) return;
if (!agentManager) {
toastr.error('Agent 未初始化');
return;
}
const selectedCharId = $('#acc-target-char').val();
const selectedWorld = $('#acc-target-world').val();
if (!selectedCharId && selectedCharId !== '0') {
toastr.warning('请先选择一个目标角色(或选择新建)');
return;
}
addMessage('user', message);
input.val('');
$('#acc-send-btn').prop('disabled', true);
$('#acc-status-indicator').removeClass('status-idle').addClass('status-working').text('工作中...');
try {
agentManager.setContext(selectedCharId, selectedWorld);
await agentManager.handleUserMessage(
message,
(content, role) => {
addMessage(role, content);
},
(toolName, args) => {
updatePreview(toolName, args);
}
);
} catch (error) {
console.error('Agent Error:', error);
addMessage('system', `发生错误: ${error.message}`);
} finally {
$('#acc-send-btn').prop('disabled', false);
$('#acc-status-indicator').removeClass('status-working').addClass('status-idle').text('空闲');
}
}
function addMessage(role, content) {
const stream = $('#acc-chat-stream');
let displayContent = content;
if (role === 'executor') {
const tools = [
'read_world_info', 'write_world_info_entry', 'create_world_book',
'read_character_card', 'update_character_card', 'edit_character_text',
'manage_first_message', 'use_tool'
];
const regex = new RegExp(`<(${tools.join('|')})>[\\s\\S]*?<\\/\\1>`, 'g');
displayContent = content.replace(regex, '').trim();
if (!displayContent) {
displayContent = "(正在执行操作...)";
}
}
const escapedContent = displayContent
.replace(/&/g, "&")
.replace(//g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
const formattedContent = escapedContent.replace(/\n/g, '
');
const msgDiv = $('
${contentHtml}${entry.content}