CopilotDock 是 SonnetDB Web 管理界面中的 AI 助手面板,以浮动气泡形式存在于页面右下角。它不是一个简单的聊天窗口,而是一个深度感知页面上下文、具备权限管理能力、支持 50 条会话历史的智能工作台。
面板有两种形态:
<div v-if="!visible" class="copilot-fab" @click="open" title="打开 Copilot 助手">
<span class="copilot-fab-icon">AI</span>
</div>
<div v-else ref="dockEl" class="copilot-dock"
:class="{ 'is-fullscreen': fullscreen }" :style="dockStyle">
用户可以通过鼠标拖拽面板标题栏改变位置,点击全屏按钮展开到满屏,也可以随时折叠回收。
面板会自动感知当前访问的页面,在输入框上方显示上下文标签和快捷操作按钮。例如在 SQL Console 页面时,Copilot 会显示"SQL Console"标签,并建议"解释当前 SQL"或"优化查询"等快捷操作。这通过计算属性 pageContext 和 assistantActions 实现:
const pageContext = computed(() => { /* 自动识别当前路由 */ });
const assistantActions = computed(() => { /* 根据页面生成快捷操作按钮 */ });
用户还可以手动关闭或重新启用页面上下文,灵活控制 Copilot 的感知范围。
M7 特性引入了明确的权限模式切换(M7):
切换时有内联确认条,防止误操作:
<n-tag v-if="permissionMode === 'read-only'" @click="permConfirmVisible = !permConfirmVisible"
size="tiny" type="success" :bordered="false">只读模式</n-tag>
<transition name="perm-confirm">
<div v-if="permConfirmVisible" class="copilot-dock__perm-confirm">
<n-text>切换后 Copilot 可执行写入语句,是否启用?</n-text>
<n-button @click="permissionMode = 'read-write'">启用读写</n-button>
<n-button @click="permConfirmVisible = false">取消</n-button>
</div>
</transition>
useCopilotSessionsStore Pinia store 管理会话的完整生命周期:
localStorage(Key: sndb.copilot.sessions.v1)const STORAGE_KEY = 'sndb.copilot.sessions.v1';
const MAX_SESSIONS = 50;
function appendTurn(id, db, user, assistant): CopilotSession {
let session = id ? sessions.value.find(...) : null;
if (!session) session = create(db);
session.messages.push(user, assistant);
session.updatedAt = Date.now();
// 首次自动派生标题
if (session.title === '新会话')
session.title = deriveTitle(session.messages, '新会话');
return session;
}
CopilotDock 通过 SSE 流逐行渲染 AI 回答,同时显示引用来源(文档、技能、工具结果)。每条引用包含编号、标题、来源和摘要片段,用户点击即可溯源,保证 AI 回答的可验证性。