refactor: 设置面板移除工具相关,全部移入工具面板
- 设置面板不再包含 Tool Calling 和命令执行配置 - 工具面板新增 Tool Calling 主开关 - Tool Calling 和 run_command 状态完全由工具面板管理 - 清理 settings-modal.ts 中的工具相关代码
This commit is contained in:
@@ -6,7 +6,6 @@ import { state, KEYS } from '../state/state.js';
|
|||||||
import { debounce } from '../utils/utils.js';
|
import { debounce } from '../utils/utils.js';
|
||||||
import { encryptData, decryptData } from '../services/crypto.js';
|
import { encryptData, decryptData } from '../services/crypto.js';
|
||||||
import { setMemoryEnabled, setEmbeddingModel, getEmbeddingModel, isVectorMemoryEnabled, getMemoryCache } from '../services/memory-manager.js';
|
import { setMemoryEnabled, setEmbeddingModel, getEmbeddingModel, isVectorMemoryEnabled, getMemoryCache } from '../services/memory-manager.js';
|
||||||
import { setToolEnabled } from '../services/tool-registry.js';
|
|
||||||
import { logSetting, logInfo, logWarn, logError, logSuccess } from '../services/log-service.js';
|
import { logSetting, logInfo, logWarn, logError, logSuccess } from '../services/log-service.js';
|
||||||
import { checkConnection, updateConnectionInfo, updateRunningModels } from './header.js';
|
import { checkConnection, updateConnectionInfo, updateRunningModels } from './header.js';
|
||||||
import { loadModels } from './model-bar.js';
|
import { loadModels } from './model-bar.js';
|
||||||
@@ -103,45 +102,6 @@ export function initSettingsModal(): void {
|
|||||||
await importSessions(paths[0]);
|
await importSessions(paths[0]);
|
||||||
});
|
});
|
||||||
|
|
||||||
// ── Tool Calling 设置 ──
|
|
||||||
const toggleToolCalling = document.querySelector('#toggleToolCalling') as HTMLInputElement;
|
|
||||||
if (toggleToolCalling) {
|
|
||||||
toggleToolCalling.addEventListener('change', async () => {
|
|
||||||
const db = state.get<ChatDB | null>(KEYS.DB);
|
|
||||||
state.set('toolCallingEnabled', toggleToolCalling.checked);
|
|
||||||
if (db) await db.saveSetting('toolCallingEnabled', toggleToolCalling.checked);
|
|
||||||
if (toggleToolCalling.checked) {
|
|
||||||
const modelSupportsTools = state.get<boolean>('modelSupportsTools', false);
|
|
||||||
if (!modelSupportsTools) {
|
|
||||||
showToast('⚠️ 当前模型可能不支持 Tool Calling,建议使用 Qwen3、Llama 3.1+ 等模型', 'warning', 5000);
|
|
||||||
logWarn('Tool Calling 已开启(模型不支持)');
|
|
||||||
} else {
|
|
||||||
showToast('工具调用已开启', 'info');
|
|
||||||
logInfo('Tool Calling 已开启');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
showToast('工具调用已关闭', 'info');
|
|
||||||
logInfo('Tool Calling 已关闭');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const toggleRunCommand = document.querySelector('#toggleRunCommand') as HTMLInputElement;
|
|
||||||
if (toggleRunCommand) {
|
|
||||||
toggleRunCommand.addEventListener('change', async () => {
|
|
||||||
const db = state.get<ChatDB | null>(KEYS.DB);
|
|
||||||
state.set('runCommandEnabled', toggleRunCommand.checked);
|
|
||||||
if (db) await db.saveSetting('runCommandEnabled', toggleRunCommand.checked);
|
|
||||||
setToolEnabled('run_command', toggleRunCommand.checked);
|
|
||||||
if (toggleRunCommand.checked) {
|
|
||||||
showToast('命令执行已开启(每次执行需确认)', 'info');
|
|
||||||
logInfo('命令执行已开启');
|
|
||||||
} else {
|
|
||||||
showToast('命令执行已关闭', 'info');
|
|
||||||
logInfo('命令执行已关闭');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── Agent 记忆设置 ──
|
// ── Agent 记忆设置 ──
|
||||||
const toggleMemory = document.querySelector('#toggleMemoryEnabled') as HTMLInputElement;
|
const toggleMemory = document.querySelector('#toggleMemoryEnabled') as HTMLInputElement;
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
/**
|
/**
|
||||||
* ToolsModal - 工具面板模态框
|
* ToolsModal - 工具面板模态框
|
||||||
* 展示所有可用工具的详细信息
|
* 展示所有可用工具的详细信息,管理 Tool Calling 开关
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { state, KEYS } from '../state/state.js';
|
import { state, KEYS } from '../state/state.js';
|
||||||
import { setToolEnabled } from '../services/tool-registry.js';
|
import { setToolEnabled } from '../services/tool-registry.js';
|
||||||
import { showToast } from './toast.js';
|
import { showToast } from './toast.js';
|
||||||
import { logInfo } from '../services/log-service.js';
|
import { logInfo, logWarn } from '../services/log-service.js';
|
||||||
import type { ChatDB } from '../types.js';
|
import type { ChatDB } from '../types.js';
|
||||||
|
|
||||||
let modalEl: HTMLElement;
|
let modalEl: HTMLElement;
|
||||||
@@ -21,25 +21,37 @@ export function initToolsModal(): void {
|
|||||||
if (e.target === modalEl) closeToolsModal();
|
if (e.target === modalEl) closeToolsModal();
|
||||||
});
|
});
|
||||||
|
|
||||||
// 设置中"查看全部工具"按钮
|
// Tool Calling 主开关
|
||||||
document.querySelector('#btnOpenToolsFromSettings')?.addEventListener('click', () => {
|
const toggleToolCalling = modalEl.querySelector('#toggleToolCalling') as HTMLInputElement;
|
||||||
(document.querySelector('#settingsModal') as HTMLElement).style.display = 'none';
|
if (toggleToolCalling) {
|
||||||
openToolsModal();
|
toggleToolCalling.addEventListener('change', async () => {
|
||||||
});
|
const db = state.get<ChatDB | null>(KEYS.DB);
|
||||||
|
state.set('toolCallingEnabled', toggleToolCalling.checked);
|
||||||
|
if (db) await db.saveSetting('toolCallingEnabled', toggleToolCalling.checked);
|
||||||
|
if (toggleToolCalling.checked) {
|
||||||
|
const modelSupportsTools = state.get<boolean>('modelSupportsTools', false);
|
||||||
|
if (!modelSupportsTools) {
|
||||||
|
showToast('⚠️ 当前模型可能不支持 Tool Calling,建议使用 Qwen3、Llama 3.1+ 等模型', 'warning', 5000);
|
||||||
|
logWarn('Tool Calling 已开启(模型不支持)');
|
||||||
|
} else {
|
||||||
|
showToast('工具调用已开启', 'info');
|
||||||
|
logInfo('Tool Calling 已开启');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
showToast('工具调用已关闭', 'info');
|
||||||
|
logInfo('Tool Calling 已关闭');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// run_command 开关(模态框中)
|
// run_command 开关
|
||||||
const toggle2 = document.querySelector('#toggleRunCommand2') as HTMLInputElement;
|
const toggle2 = modalEl.querySelector('#toggleRunCommand2') as HTMLInputElement;
|
||||||
if (toggle2) {
|
if (toggle2) {
|
||||||
toggle2.addEventListener('change', async () => {
|
toggle2.addEventListener('change', async () => {
|
||||||
const db = state.get<ChatDB | null>(KEYS.DB);
|
const db = state.get<ChatDB | null>(KEYS.DB);
|
||||||
state.set('runCommandEnabled', toggle2.checked);
|
state.set('runCommandEnabled', toggle2.checked);
|
||||||
if (db) await db.saveSetting('runCommandEnabled', toggle2.checked);
|
if (db) await db.saveSetting('runCommandEnabled', toggle2.checked);
|
||||||
setToolEnabled('run_command', toggle2.checked);
|
setToolEnabled('run_command', toggle2.checked);
|
||||||
|
|
||||||
// 同步设置面板的开关
|
|
||||||
const toggle1 = document.querySelector('#toggleRunCommand') as HTMLInputElement;
|
|
||||||
if (toggle1) toggle1.checked = toggle2.checked;
|
|
||||||
|
|
||||||
if (toggle2.checked) {
|
if (toggle2.checked) {
|
||||||
showToast('命令执行已开启(每次执行需确认)', 'info');
|
showToast('命令执行已开启(每次执行需确认)', 'info');
|
||||||
logInfo('命令执行已开启');
|
logInfo('命令执行已开启');
|
||||||
@@ -52,9 +64,13 @@ export function initToolsModal(): void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function openToolsModal(): void {
|
export function openToolsModal(): void {
|
||||||
// 同步 run_command 开关状态
|
// 同步开关状态
|
||||||
|
const toolCallingEnabled = state.get<boolean>('toolCallingEnabled', false);
|
||||||
|
const toggleTC = modalEl.querySelector('#toggleToolCalling') as HTMLInputElement;
|
||||||
|
if (toggleTC) toggleTC.checked = toolCallingEnabled;
|
||||||
|
|
||||||
const runCmdEnabled = state.get<boolean>('runCommandEnabled', true);
|
const runCmdEnabled = state.get<boolean>('runCommandEnabled', true);
|
||||||
const toggle2 = document.querySelector('#toggleRunCommand2') as HTMLInputElement;
|
const toggle2 = modalEl.querySelector('#toggleRunCommand2') as HTMLInputElement;
|
||||||
if (toggle2) toggle2.checked = runCmdEnabled;
|
if (toggle2) toggle2.checked = runCmdEnabled;
|
||||||
|
|
||||||
modalEl.style.display = '';
|
modalEl.style.display = '';
|
||||||
|
|||||||
+9
-22
@@ -266,27 +266,6 @@
|
|||||||
<p class="text-muted">无运行中的模型</p>
|
<p class="text-muted">无运行中的模型</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-group">
|
|
||||||
<label class="setting-label">
|
|
||||||
🔧 工具调用(Tool Calling)
|
|
||||||
<label class="toggle-label" style="margin-left:auto;display:inline-flex;">
|
|
||||||
<input type="checkbox" id="toggleToolCalling">
|
|
||||||
<span class="toggle-slider"></span>
|
|
||||||
</label>
|
|
||||||
</label>
|
|
||||||
<p class="text-muted" style="font-size:11px;margin-bottom:8px;">启用后,AI 可以在对话中主动调用本地工具(读写文件、搜索、创建目录等)。需要模型支持 Tool Calling。</p>
|
|
||||||
<div style="display:flex;gap:8px;align-items:center;">
|
|
||||||
<button class="btn btn-sm btn-outline" id="btnOpenToolsFromSettings">🔧 查看全部工具(12 个)</button>
|
|
||||||
<div class="tool-item" style="flex:1;margin:0;">
|
|
||||||
<span>💻 执行命令</span>
|
|
||||||
<label class="toggle-label" style="margin:0;">
|
|
||||||
<input type="checkbox" id="toggleRunCommand">
|
|
||||||
<span class="toggle-slider"></span>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<p class="text-muted" style="font-size:11px;margin-top:8px;">⚠️ 高风险操作会弹出确认对话框。系统关键路径(/etc, /sys, ~/.ssh 等)已自动屏蔽。</p>
|
|
||||||
</div>
|
|
||||||
<div class="setting-group">
|
<div class="setting-group">
|
||||||
<label class="setting-label">🖥️ 工作空间目录</label>
|
<label class="setting-label">🖥️ 工作空间目录</label>
|
||||||
<div style="display:flex;gap:8px;align-items:center;">
|
<div style="display:flex;gap:8px;align-items:center;">
|
||||||
@@ -392,7 +371,15 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<p class="text-muted" style="font-size:12px;margin-bottom:12px;">启用工具调用后,AI 可在对话中自主调用以下工具。高风险操作需用户确认。</p>
|
<div style="display:flex;align-items:center;gap:10px;margin-bottom:12px;padding:8px 12px;background:var(--bg-layer);border-radius:var(--radius-control);border:1px solid var(--border-subtle);">
|
||||||
|
<span style="font-size:13px;font-weight:600;">启用工具调用</span>
|
||||||
|
<label class="toggle-label" style="margin:0;">
|
||||||
|
<input type="checkbox" id="toggleToolCalling">
|
||||||
|
<span class="toggle-slider"></span>
|
||||||
|
</label>
|
||||||
|
<span class="text-muted" style="font-size:11px;margin-left:auto;">需要模型支持 Tool Calling</span>
|
||||||
|
</div>
|
||||||
|
<p class="text-muted" style="font-size:12px;margin-bottom:12px;">启用后,AI 可在对话中自主调用以下工具。高风险操作需用户确认。系统关键路径自动屏蔽。</p>
|
||||||
<div class="tools-grid">
|
<div class="tools-grid">
|
||||||
<div class="tool-card">
|
<div class="tool-card">
|
||||||
<div class="tool-card-header"><span class="tool-card-icon">📄</span><span class="tool-card-name">read_file</span><span class="tool-card-badge auto">自动</span></div>
|
<div class="tool-card-header"><span class="tool-card-icon">📄</span><span class="tool-card-name">read_file</span><span class="tool-card-badge auto">自动</span></div>
|
||||||
|
|||||||
Reference in New Issue
Block a user