kuaifan 70ad8c394a feat(ai-assistant): 添加聊天窗口模式和页面上下文感知
- 新增 chat 显示模式,支持可拖拽的悬浮聊天窗口
  - 新增 page-context.js,根据当前路由提供针对性系统提示词
  - 优化浮动按钮:添加淡入淡出动画、修复右键菜单拖动问题、更新配色
  - 重构 Modal 为独立组件,支持 modal/chat 双模式切换
  - 恢复会话时自动滚动到底部
2026-01-15 15:06:38 +00:00

227 lines
6.5 KiB
JavaScript
Vendored
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* AI 助手页面上下文配置
*
* 根据当前路由和应用状态,为 AI 助手提供针对性的系统提示词
* 原则:诚实描述 AI 能力边界,不承诺做不到的事情
*/
/**
* 获取当前页面的 AI 上下文
* @param {Object} store - Vuex store 实例
* @returns {Object} { systemPrompt, title }
*/
export function getPageContext(store) {
const routeName = store.state.routeName;
const contextMap = {
'manage-dashboard': getDashboardContext,
'manage-project': getProjectContext,
'manage-messenger': getMessengerContext,
'manage-calendar': getCalendarContext,
'manage-file': getFileContext,
};
const getContext = contextMap[routeName];
if (getContext) {
return getContext(store);
}
return getDefaultContext();
}
/**
* 仪表盘上下文
*/
function getDashboardContext(store) {
const dashboardTask = store.getters.dashboardTask || {};
const assistTask = store.getters.assistTask || [];
const overdueCount = dashboardTask.overdue_count || 0;
const todayCount = dashboardTask.today_count || 0;
const todoCount = dashboardTask.todo_count || 0;
const assistCount = assistTask.length || 0;
const lines = [
'你是一个工作效率助手。用户正在查看仪表盘。',
'',
'当前任务概况:',
];
if (overdueCount > 0 || todayCount > 0 || todoCount > 0 || assistCount > 0) {
if (overdueCount > 0) lines.push(`- 逾期任务:${overdueCount}`);
if (todayCount > 0) lines.push(`- 今日到期:${todayCount}`);
if (todoCount > 0) lines.push(`- 待办任务:${todoCount}`);
if (assistCount > 0) lines.push(`- 协助任务:${assistCount}`);
} else {
lines.push('- 暂无待办任务');
}
lines.push(
'',
'你可以帮助用户:',
'- 回答任务管理和时间规划相关问题',
'- 根据用户描述的任务情况给出优先级建议',
'- 协助用户整理和规划工作思路',
);
return {
title: '工作助手',
systemPrompt: lines.join('\n'),
};
}
/**
* 项目详情上下文
*/
function getProjectContext(store) {
const project = store.getters.projectData || {};
const columns = store.state.cacheColumns || [];
const tasks = store.state.cacheTasks || [];
const lines = [
'你是一个项目管理助手。用户正在查看项目详情页面。',
];
if (project.id) {
// 项目基本信息
lines.push('', '当前项目:');
lines.push(`- project_id${project.id}`);
if (project.name) {
lines.push(`- 名称:${project.name}`);
}
if (project.desc) {
const desc = project.desc.length > 200 ? project.desc.substring(0, 200) + '...' : project.desc;
lines.push(`- 描述:${desc}`);
}
// 任务统计
const projectTasks = tasks.filter(t => t.project_id === project.id);
if (projectTasks.length > 0) {
const completedCount = projectTasks.filter(t => t.complete_at).length;
const overdueCount = projectTasks.filter(t => !t.complete_at && t.end_at && new Date(t.end_at) < new Date()).length;
lines.push('', '任务统计:');
lines.push(`- 总任务:${projectTasks.length}`);
lines.push(`- 已完成:${completedCount}`);
if (overdueCount > 0) {
lines.push(`- 已逾期:${overdueCount}`);
}
}
// 看板列
const projectColumns = columns.filter(c => c.project_id === project.id);
if (projectColumns.length > 0) {
const columnNames = projectColumns.map(c => c.name).join('、');
lines.push('', `看板列:${columnNames}`);
}
}
lines.push(
'',
'你可以帮助用户:',
'- 协助拆解用户描述的需求为具体任务',
'- 回答项目管理方法和最佳实践问题',
'- 根据用户提供的信息给出排期建议',
);
return {
title: '项目助手',
systemPrompt: lines.join('\n'),
};
}
/**
* 消息对话上下文
*/
function getMessengerContext(store) {
const dialogId = store.state.dialogId;
const dialogs = store.state.cacheDialogs || [];
const dialog = dialogs.find(d => d.id === dialogId);
const lines = [
'你是一个沟通协作助手。用户正在使用消息功能。',
];
if (dialog) {
const dialogType = dialog.type === 'group' ? '群聊' : '私聊';
lines.push('', '当前对话:');
lines.push(`- dialog_id${dialog.id}`);
lines.push(`- 类型:${dialogType}`);
if (dialog.name) {
lines.push(`- 名称:${dialog.name}`);
}
}
lines.push(
'',
'你可以帮助用户:',
'- 润色和优化用户输入的消息内容',
'- 根据用户描述的场景生成得体的回复',
'- 翻译消息内容',
'',
'请保持回复简洁、专业、得体。',
);
return {
title: '沟通助手',
systemPrompt: lines.join('\n'),
};
}
/**
* 日历上下文
*/
function getCalendarContext() {
const lines = [
'你是一个时间管理助手。用户正在查看日历。',
'',
'你可以帮助用户:',
'- 回答时间管理和日程规划相关问题',
'- 根据用户描述的安排给出优化建议',
'- 协助用户合理安排会议和任务时间',
];
return {
title: '日程助手',
systemPrompt: lines.join('\n'),
};
}
/**
* 文件管理上下文
*/
function getFileContext() {
const lines = [
'你是一个文件管理助手。用户正在查看文件管理页面。',
'',
'你可以帮助用户:',
'- 回答文件整理和分类相关问题',
'- 根据用户描述建议文件命名和组织方式',
];
return {
title: '文件助手',
systemPrompt: lines.join('\n'),
};
}
/**
* 默认上下文(通用)
*/
function getDefaultContext() {
const lines = [
'你是 DooTask 的 AI 助手。',
'',
'你可以帮助用户:',
'- 回答任务管理和项目协作相关问题',
'- 提供工作效率和方法论建议',
'- 协助处理各种工作事务',
];
return {
title: 'AI 助手',
systemPrompt: lines.join('\n'),
};
}